在排序过程中,我们可以通过是否出现内外存的交换,可将排序分为内部排序(内排序)和外部排序(外排序)
内排序(不涉及内外存交换)主要适用于记录个数不多的小文件
外排序(进行数据内外存交换)适用于记录文件个数过多,不能一次将所有文件放入内存的大文件。
排序的稳定性:
在待排序的文件中,出现了多个相同的关键字,若在排序之后,这些相同的关键字的之间相对顺序保持不变,那么,这个排序方法是稳定的,否则,这种排序方法是不稳定的。
举个栗子:
有两个重复的关键字10,
稳定排序
排序前: 10 5 8 10` 9 20排序后: 5 8 9 10 10` 20不稳定排序
排序前: 10 5 8 10` 9 20 排序后: 5 8 9 10` 10 20
排序效率的评价指标 ------- 评价排序算法好坏的标准
1.执行时间(时间复杂度)
2.辅助空间(空间复杂度)
这篇文章主要分析内排序~
按照使用的策略不同,内排序可分为五类:
插入排序,交换排序、选择排序,基数排序、归并排序
一、插入排序
算法思想:每次将一个待排序的记录按照关键字的大小插入到前面已排好序的文件中的合适位置,直到全部插入完毕
主要插入排序算法:
1.直接插入排序
最好时间复杂度:O(n) ---> 待排序记录有序最坏时间复杂度:O(n²) ---> 待排序记录为逆序平均时间复杂度:T(n) = O(n²)2.折半插入排序
3.希尔排序
算法描述:取一个小于记录长度n的整数d1作为第一个增量,把文件分成d1个组,所有距离为d1的记录放入同一个组中,在各组内进行直接插入排序,
取第二个增量d2 < d1 重复上述过程,直到所有记录在同一组中。
49 38 65 97 76 13 27 49` 55 04第一趟 d1 = 5第一组 49 13第二组 38 27第三组 65 49`第四组 97 55第五组 76 65 04第一趟排序结果: 13 27 49` 55 04 49 38 65 97 76第二趟d2 = 3第一组 13 55 38 76第二组 27 04 65第三组 49` 49 97第二趟排序结果: 13 04 49` 38 27 49 55 65 97 76第三趟d3=1第三趟排序结果: 04 13 27 38 49` 49 55 65 76 97平均时间复杂度O(n^1.3)
是不稳定的排序算法
二、交换排序
1.冒泡排序
算法描述:每次排序,将无序区最小的记录插入到有序区末尾,
最好时间复杂度:O(n) ---->原始数据正序时
最坏时间复杂度:O(n²) ----->原始数据逆序时
平均时间复杂度:O(n²)
2.快速排序
选择一个基准,基准左侧的记录都小于基准,基准右侧的记录大于基准,基准落在最终排序后的位置上。
49 38 65 97 76 13 27 49`第一次排序 l h 49 38 65 97 76 13 27 49` l h 27 38 65 97 76 13 49 49` l h 27 38 65 97 76 13 49 49` l h 27 38 49 97 76 13 65 49` l h 27 38 13 97 76 49 65 49` l h 27 38 13 49 76 97 65 49` l h 27 38 13 49 76 97 65 49` l h 基准第一趟排序后:【27 38 13】 49 【76 97 65 49`】 第二趟排序后:【13】 27 【38】 49 【49` 65】 76 【97】 第三趟排序后: 13 27 38 49 49` 【65】 76 97
最好时间复杂度 O(nlog₂n) ---> 每次排序都是左右两个无序子区长度大致相同时
最坏时间复杂度 O(n²) ----> 原始数据有序时
平均时间复杂度 O(nlog₂n)
是不稳定的排序算法: 反例: 2 2` 1
三、选择排序
1.直接选择
算法描述:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好的子文件中,直到全部记录排序完毕。
初始文件正序时,移动次数为 0
初始文件逆序时,移动次数为3(n-1)
总的比较次数为O(n²)
时间复杂度O(n²)
是不稳定的排序算法。 反例: 2 2` 1
2.堆排序
在排序过程中,将R[1]到R[n]看成是完全二叉树顺序存储结构,利用完全二叉树中双亲节点和孩结点间的内在关系,实现堆排序。
时间复杂度 T(n) = O(nlogn)
3.树形选择
又称锦标赛排序,对n个关键字进行两两比较,然后在其中n/2个较小者中再进行两两比较,知道选出最小关键字为止
时间复杂度:T(n) = O(nlogn)
四、归并排序
归并:将若干个有序子文件合并成一个有序文件
时间复杂度:T(n) = O(nlogn)
空间复杂度 : O(n)
五、基数排序
基数排序是借助“多关键字排序”的思想来实现“单排序排序”的内部排序算法
内排序算法分析
性能方面
1.当序列基本有序时,直接插入是最佳的排序算法。当记录中数据较多,应采用移动次数较少的简单排序算法
2.快排、堆排序、归并排序的平均时间复杂度为O(nlogn)。其中堆排序、归并排序最好最坏时间复杂度都为O(nlogn)。
辅助空间
3.快排是所有排序算法中性能最好的,但在记录有序的情况下,时间复杂度为O(n²),所需的辅助空间多于堆排序
4.所需辅助空间最多的为归并排序,需要有与原始数据相等的辅助空间。
稳定性方面
5.所有的简单排序算法中,只有简单选择排序是不稳定的,其余都是稳定的排序算法,
6.在性能较好的排序算法中,快排、希尔排序、堆排序都是不稳定的,只有归并、基数排序是稳定的。
直接上图
转载于:https://www.cnblogs.com/LXIN-Y/p/9096204.html
相关资源:排序算法.doc 详细讲解了插入排序、交换排序、选择排序、归并排序等排序算法的原理以及实现代码