根据排序过程中借助的主要操作,我们将内排序分为四类:
- 插入排序类
- 直接插入排序
- 希尔排序
- 选择排序类
- 简单选择排序
- 堆排序
- 交换排序类
- 冒泡排序
- 快速排序
- 归并排序类
- 归并排序
从算法的简单性来看,我们将7种算法分为两类:
- 简单算法:冒泡排序、简单选择排序、直接插入排序
- 改进算法:希尔排序、堆排序、归并排序、快速排序
7种算法的时间复杂度:
平均时间复杂度
- 冒泡排序 O(n2)
- 简单选择排序 O(n2)
- 直接插入排序 O(n2)
- 希尔排序 O(n3/2)
- 堆排序 O(nlogn)
- 归并排序 O(nlogn)
- 快速排序 O(nlogn)
注:使用了双重循坏简单算法的时间复杂度为O(n2),使用了递归调用的改进算法的时间复杂度为O(nlogn)。
最坏时间复杂度
快速排序的最坏时间复杂度为O(n2)
其他的几个算法的最坏时间复杂度均与平均情况相同
最好时间复杂度
冒泡排序和直接插入排序的做好时间复杂度为O(n)
其他的几个算法的最好时间复杂度均与平均情况相同
7种算法的稳定性:
造成不稳定的原因:关键字的比较和交换是跳跃性的。
简单算法的都是稳定的,改进算法中只有归并排序是稳定的,其他的三个算法都不稳定。
7中算法的辅助空间要求:
归并排序在归并的过程中需要与原始记录同样数量的存储空间存放归并结果以及递归时深度为log2n的栈空间,因此时间复杂度为O(n)。
快速排序的过程中由于递归造成栈空间的使用,最好情况下,递归树的深度为log2n,其空间复杂度为O(logn),最差情况,需要进行n-1次递归调用,其空间复杂度为O(n),平均情况下,空间复杂度为O(logn)。
其他几种排序算法的空间复杂度均为O(1)。
对7中算法的各种指标总结:
平均情况看:显然最后三种算法要胜过希尔算法,并远远超过前3种简单算法。
最好情况看:反而冒泡和直接插入排序要更胜一筹,也就是说,如果待排序序列总是基本有序,反而并应该考虑4种改进算法。
最坏情况看:堆排序与归并排序要强过与快速排序以及其他简单排序。
空间复杂度:归并排序的空间要求为O(n),快速排序为O(logn)~O(n),而其他几种排序空间要求均为O(1),
如果执行算法的软件所处的环境非常在乎内存的使用量时,选择归并排序和快速排序就不是一个较好的策略。
稳定性:归并排序独占鳌头,对于非常在乎排序稳定性的应用中,归并排序是个好算法。
待排序记录的个数:待排序的个数n越小,采用简单排序方法越合适。反之n越大,采用改进方法越合适。
这就是优化改进算法时增加一个阀值的原因,低于阀值时采用简单排序方法。
综合各项指标来说:经过优化的快速排序是性能最好的排序算法。
注:不同场合我们应该考虑使用不同的算法来应对它,以达到最优。具体问题具体对待。