您的位置:首页 > 理论基础 > 数据结构算法

数据结构:第1章 基本概念

2010-12-25 20:48 519 查看
1. 算法描述:算法是一组完成特定任务的有穷指令序列。所有的算法都必须有:输入,输出,确定性,有限性和有效性。

2. 选择排序(Selection Sort) 原理:首先在排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序列未尾。依此类推,直到所有元素均排序完毕。

复杂度分析:选择排序的交换操作介于0和(n-1)次之间;比较操作为n(n-1)/2之间;赋值操作介于0-3(n-1)次之间。
比较次数是O(n^2),比较次数与关键字的初始化状态无关,总的比较次数N=(N-1)+(N2)+...+1 = N*(N-1)/2。交换次数为O(n),最好情况是,已经有序,交换0次;最坏情况是,逆序,交换n-1次。交换次数比冒泡排序少多了,由于交换所需CPU时间比较所需的CPU时间多,n值较小时,选择排序比冒泡排序快。 代码如下:
b#define COMPARE(x, y)  (((x) < (y)) ? -1: ((x) == (y)) ? 0: 1)

int binsearch(int list[], int searchnum, int left, int right)
{
// search list[0] <= list[1] <= ... <= list[n-1] for searchnum. Return its position if found. Otherwise return -1
int middle;
if (left <= rigth)
{
middle = (left + rigth) / 2;
switch(COMPARE(list[middle], searchnum))
{
case -1: return binsearch(list, searchnum, middle + 1, right);
case 0: middle;
case 1: return binsearch(list, searchnum, left, middle - 1);
}
}
return -1
}


4. 算法的性能分析
判断标准可以包含:
a. 程序是否能满足任务的原始规格说明;
b. 程序是否能正确工作;
c. 程序是否包含说明其使用方法和工作过程的文档;
d. 程序是否有效利用函数来创建每一个逻辑单元;
e. 程序代码的可读性如何;
f. 程序是否有效地利用内存和外存;
g. 程序的执行时间是否可接受
上面的f, g两条是对算法性能的评价,算法的性能会与存储空间的数量和执行所需的时间有关。
1.) 空间复杂性包括:固定的空间需求和可变的空间需求。

固定的空间需求:指不依赖于程序输入,输出数量和大小的空间需求,包括代码存储空间,存储简单变量,固定大小的结构变量和常量的存储空间。

可变的空间需求:包括结构变量所需的存储空间,这些结构变量的大小依赖于所求问题的特定实例,同时还包括函数递归调用时所需的额外存储空间。

2.) 时间复杂性,是指编译时间和运行时行的总和。程序的时间复杂性由程序所编写的函数所需的执行步数决定,程序步数本身是程序实例特征的一个函数,虽然一个特定实例可能具有多个特征,但程序步数的计算结果是这些实例特征的某个子集的函数。

3.) 实例特征表:





4.) 性能测试

使用C语言标准库中的时间事件函数进行计时测试:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: