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

数据结构复习——第八章:排序

2015-01-01 20:01 302 查看
1.文件:由一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字;

2.排序是将文件按关键字的递增(减)顺序排列;

3.排序文件中有相同的关键字时,若排序后相对次序保持不变的称稳定排序,否则称不稳定排序;

4.在排序过程中,文件放在内存中处理不涉及数据的内、外存交换的称内排序,反之称外排序;

5.排序算法的基本操作:1)比较关键字的大小;2)改变指向记录的指针或移动记录本身。

6.评价排序方法的标准:1)执行时间;2)所需辅助空间,辅助空间为O(1)称就地排序;另要注意算法的复杂程度。

7.若关键字类型没有比较运算符,可事先定义宏或函数表示比较运算。

8.插入排序

(1)直接插入排序

算法中引入监视哨R[0]的作用是:1)保存R[i]的副本;2)简化边界条件,防止循环下标越界。

关键字比较次数最大为(n+2)(n-1)/2;记录移动次数最大为(n+4)(n-1)/2;

算法的最好时间是O(n);最坏时间是O(n^2);平均时间是O(n^2);是一种就地的稳定的排序;

(2)希尔排序

实现过程:是将直接插入排序的间隔变为d。d的取值要注意:1)最后一次必为1;2)避免d值互为倍数;

关键字比较次数最大为n^1.25;记录移动次数最大为1.6n^1.25;

算法的平均时间是O(n^1.25);是一种就地的不稳定的排序;

9.交换排序

(1)冒泡排序

实现过程:从下到上相邻两个比较,按小在上原则扫描一次,确定最小值,重复n-1次。

关键字比较次数最小为n-1、最大为n(n-1)/2;记录移动次数最小为0,最大为3n(n-1)/2;

算法的最好时间是O(n);最坏时间是O(n^2);平均时间是O(n^2);是一种就地的稳定的排序;

(2)快速排序

实现过程:将第一个值作为基准,设置i,j指针交替从两头与基准比较,有交换后,交换j,i。i=j时确定基准,并以其为界限将序列分为两段。重复以上步骤。

关键字比较次数最好为nlog2n+nC(1)、最坏为n(n-1)/2;

算法的最好时间是O(nlog2n);最坏时间是O(n^2);平均时间是O(nlog2n);辅助空间为O(log2n);是一种不稳定排序;

10.选择排序

(1)直接选择排序

实现过程:选择序列中最小的插入第一位,在剩余的序列中重复上一步,共重复n-1次。

关键字比较次数为n(n-1)/2;记录移动次数最小为0,最大为3(n-1);

算法的最好时间是O(n^2);最坏时间是O(n^2);平均时间是O(n^2);是一种就地的不稳定的排序;

(2)堆排序

实现过程:把序列按层次填入完全二叉树,调整位置使双亲大于或小于孩子,建立初始大根或小根堆,调整树根与最后一个叶子的位置,排除该叶子重新调整位置。

算法的最好时间是O(nlog2n);最坏时间是O(nlog2n);平均时间是O(nlog2n);是一种就地的不稳定排序;

11.归并排序

实现过程:将初始序列分为2个一组,最后单数轮空,对每一组排序后作为一个单元,对2个单元排序,直到结束。

算法的最好时间是O(nlog2n);最坏时间是O(nlog2n);平均时间是O(nlog2n);辅助空间为O(n);是一种稳定排序;

12.分配排序

(1)箱排序

实现过程:按关键字的取值范围确定箱子的个数,将序列按关键字放入箱中,输出非空箱的关键字。

在桶内分配和收集,及对各桶进行插入排序的时间为O(n),算法的期望时间是O(n),最坏时间是O(n^2)。

(2)基数排序

实现过程:按基数设置箱子,对关键字从低位到高位依次进行箱排序。

算法的最好时间是O(d*n+d*rd);最坏时间是O(d*n+d*rd);平均时间是O(d*n+d*rd);辅助空间O(n+rd);是一种稳定排序;

13.各种内部排序方法的比较和选择:

(1)按平均时间复杂度分为:

1) 平方阶排序:直接插入、直接选择、冒泡排序;

2) 线性对数阶:快速排序、堆排序、归并排序;

3) 指数阶:希尔排序;

4) 线性阶:箱排序、基数排序。

(2)选择合适排序方法的因素:

1)待排序的记录数;

2)记录的大小;

3)关键字的结构和初始状态;

4)对稳定性的要求;

5)语言工具的条件;

6)存储结构;

7)时间和辅助空间复杂度。

(3)结论:

1) 若规模较小可采用直接插入或直接选择排序;

2) 若文件初始状态基本有序可采用直接插入、冒泡或随机快速排序;

3) 若规模较大可采用快速排序、堆排序或归并排序;

4) 任何借助于比较的排序,至少需要O(nlog2n)的时间,箱排序和基数排序只适用于有明显结构特征的关键字;

5) 有的语言没有提供指针及递归,使归并、快速、基数排序算法复杂;

6) 记录规模较大时为避免大量移动记录可用链表作为存储结构,如插入、归并、基数排序,但快速、堆排序在链表上难以实现,可提取关键字建立索引表,然后对索引表排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: