【数据结构】学习笔记之排序

目录

一、排序概念定义

二、插入排序

2.1 直接插入排序

2.2 希尔排序

三、交换排序

3.1 冒泡排序

3.2 快速排序

四、选择排序

4.1 直接选择排序

4.2 堆排序

五、归并排序

六、分配排序

6.1 箱排序

6.2 基数排序

七、各种内部排序方法的比较和选择

7.1 按平均时间复杂度分为

7.2 选择合适排序方法的因素

八、结论


一、排序概念定义

        ‌排序算法的定义是:通过特定的算法将一组数据按照既定模式进行重新排序的操作。‌ 排序算法的目的是使一串记录按照某个或某些关键字的大小,递增或递减排列起来。这种操作在计算机科学中非常重要,尤其是在处理大量数据时,一个高效的排序算法可以大大节省时间和资源‌。

        排序算法可以分为内部排序和外部排序。内部排序是指待排序的记录数不很大,整个排序过程不需要访问外存便能完成;而外部排序则适用于待排序的记录数很大,整个排序过程不可能在内存中完成,需要访问外存的情况‌。

        稳定性是排序算法的一个重要特性。如果排序算法稳定,即当两个相同的元素在排序前后的相对位置不变,则称这种排序算法是稳定的。否则,称为不稳定的。稳定性直接影响排序结果中相同元素的相对顺序‌

        文件:由一组记录组成,记录有若干数据项组成,唯一标识记录的数据项称关键字;
        排序是将文件按关键字的递增(减)顺序排列;

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

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

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

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

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

二、插入排序


2.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.2 希尔排序


        实现过程:是将直接插入排序的间隔变为d。d的取值要注意:1)最后一次必为1;2)避免d值互为倍数;
        关键字比较次数最大为n^1.25;记录移动次数最大为1.6n^1.25;
        算法的平均时间是O(n^1.25);是一种就地的不稳定的排序;

三、交换排序


3.1 冒泡排序


实现过程:从下到上相邻两个比较,按小在上原则扫描一次,确定最小值,重复n-1次。
关键字比较次数最小为n-1、最大为n(n-1)/2;记录移动次数最小为0,最大为3n(n-1)/2;
算法的最好时间是O(n);最坏时间是O(n^2);平均时间是O(n^2);是一种就地的稳定的排序;


3.2 快速排序


实现过程:将第一个值作为基准,设置i,j指针交替从两头与基准比较,有交换后,交换j,i。i=j时确定基准,并以其为界限将序列分为两段。重复以上步骤。
关键字比较次数最好为nlog2n+nC(1)、最坏为n(n-1)/2;
算法的最好时间是O(nlog2n);最坏时间是O(n^2);平均时间是O(nlog2n);辅助空间为O(log2n);是一种不稳定排序;

四、选择排序


4.1 直接选择排序


        实现过程:选择序列中最小的插入第一位,在剩余的序列中重复上一步,共重复n-1次。
关键字比较次数为n(n-1)/2;记录移动次数最小为0,最大为3(n-1);
算法的最好时间是O(n^2);最坏时间是O(n^2);平均时间是O(n^2);是一种就地的不稳定的排序;


4.2 堆排序


        实现过程:把序列按层次填入完全二叉树,调整位置使双亲大于或小于孩子,建立初始大根或小根堆,调整树根与最后一个叶子的位置,排除该叶子重新调整位置。
算法的最好时间是O(nlog2n);最坏时间是O(nlog2n);平均时间是O(nlog2n);是一种就地的不稳定排序;

五、归并排序


        实现过程:将初始序列分为2个一组,最后单数轮空,对每一组排序后作为一个单元,对2个单元排序,直到结束。
        算法的最好时间是O(nlog2n);最坏时间是O(nlog2n);平均时间是O(nlog2n);辅助空间为O(n);是一种稳定排序;

六、分配排序


6.1 箱排序


        实现过程:按关键字的取值范围确定箱子的个数,将序列按关键字放入箱中,输出非空箱的关键字。
        在桶内分配和收集,及对各桶进行插入排序的时间为O(n),算法的期望时间是O(n),最坏时间是O(n^2)。


6.2 基数排序


        实现过程:按基数设置箱子,对关键字从低位到高位依次进行箱排序。
        算法的最好时间是O(d*n+d*rd);最坏时间是O(d*n+d*rd);平均时间是O(d*n+d*rd);辅助空间O(n+rd);是一种稳定排序;

七、各种内部排序方法的比较和选择


7.1 按平均时间复杂度分为


        1) 平方阶排序:直接插入、直接选择、冒泡排序;
        2) 线性对数阶:快速排序、堆排序、归并排序;
        3) 指数阶:希尔排序;
        4) 线性阶:箱排序、基数排序。

7.2 选择合适排序方法的因素


        1)待排序的记录数;

        2)记录的大小;

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

        4)对稳定性的要求;
        5)语言工具的条件;

        6)存储结构; 

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

八、结论


        1) 若规模较小可采用直接插入或直接选择排序;
        2) 若文件初始状态基本有序可采用直接插入、冒泡或随机快速排序;
        3) 若规模较大可采用快速排序、堆排序或归并排序;
        4) 任何借助于比较的排序,至少需要O(nlog2n)的时间,箱排序和基数排序只适用于有明显结构特征的关键字;
        5) 有的语言没有提供指针及递归,使归并、快速、基数排序算法复杂;
        6) 记录规模较大时为避免大量移动记录可用链表作为存储结构,如插入、归并、基数排序,但快速、堆排序在链表上难以实现,可提取关键字建立索引表,然后对索引表排序。
 

猜你喜欢

转载自blog.csdn.net/xiaoyingxixi1989/article/details/143099242