排序算法
排序是将一组无序的记录序列调整为有序的记录序列的操作,可以方便查找。大部分的排序算法都有两个基本的操作:(1)比较两个关键字的大小.(2)将记录从一个位置移动到另一个位置。
排序算法分类
根据完成整个排序过程是否需要访问外存可分为内部排序、外部排序。一般进行的是内部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。基于不同的扩大有序序列的方法,内部排序大致可以分为插入排序、快速排序、选择排序、归并排序。
方法 | 思想 | 分类 |
---|---|---|
插入排序 | 每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。 | 直接插入排序、折半插入排序、表插入排序、希尔排序 |
交换排序 | 比较序列中的记录,并按前小后大(或前大后小)的规则对记录进行交换 | 冒泡排序、一趟快速排序、快速排序 |
选择排序 | 从无序序列中选出关键字最小的记录,加入到有序序列 | 简单选择排序、树型选择排序、堆排序 |
归并排序 | 将两个或两个以上的有序序列归并为一个有序性序列 | 2-路归并排序 |
排序算法的效率评价
排序算法的好坏一般从时间效率、空间效率、稳定性三个方面衡量。
(1)时间效率指排序速度,即排序所花费的全部比较次数。
(2)空间效率指占内存辅助空间的大小。
(3)稳定性是相同关键字值在排序前后的先后次序是否保持一致。若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
方法 | 平均时间 | 最差 | 最佳 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
直接插入 |
O(n2)
|
O(n2)
|
O(n)
|
O(1)
| 稳定 |
冒泡排序 |
O(n2)
|
O(n2)
|
O(n)
|
O(1)
| 稳定 |
直接选择 |
O(n2)
|
O(n2)
|
O(n2)
|
O(1)
| 不稳定 |
堆排序 |
O(nlog2n)
|
O(nlog2n)
|
O(nlog2n)
|
O(1)
| 不稳定 |
希尔排序 |
O(n1.5)
|
O(1)
| 不稳定 | ||
快速排序 |
O(nlog2n)
|
O(n2)
|
O(nlog2n)
|
O(nlog2n)
| 不稳定 |
归并排序 |
O(nlog2n)
|
O(nlog2n)
|
O(nlog2n)
|
O(n)
| 稳定 |
参考数据结构对排序算法的总结,本文汇总了排序算法的分类、各类算法的性能评估,后续将详细介绍各类排序算法的思想,并进行Python代码实现。