目录
内部排序
前言
这篇文章总结了所有内部排序的适用场景,性质特点,以及空间和时间复杂度的考量;
前半部分是对内部排序的总结,后半部分是对所有内部排序的具体性能分析;
1.内部排序算法的比较
- 前面讨论的排序算法很多,对各种排序算法的比较是考研常考的内容。
- 一般基于五个因素进行对比:时间复杂度、空间复杂度、稳定性、适用性和过程特征。
1.1各种排序算法的特点、比较和适用场景
从时间复杂度看:
简单选择排序、直接插入排序和冒泡排序平均情况下的时间复杂度都为O(n²),且实现过程也较为简单,但直接插入排序和冒泡排序最好情况下的时间复杂度可以达到O(n),而简单选择排序则与序列的初始状态无关。
希尔排序作为插入排序的拓展,对较大规模的数据都可以达到很高的效率,但目前未得出其精确的渐近时间。
堆排序利用了一种称为堆的数据结构,可以在线性时间内完成建堆,且在 O(nlog₂n)内完成排序过程。
快速排序基于分治的思想,虽然最坏情况下的时间复杂度会达到 O(n²),但快速排序的平均性能可以达到 O(nlog₂n),在实际应用中常常优于其他排序算法。
归并排序同样基于分治的思想,但由于其分割子序列与初始序列的排列无关,因此它的最好、最坏和平均时间复杂度均为 O(nlog₂n)。
从空间复杂度看:
简单选择排序、插入排序、冒泡排序、希尔排序和堆排序都仅需借助常数个辅助空间。
快速排序需要借助一个递归工作栈,平均大小为 O(log₂n),当然在最坏情况下可能会增长到 O(n)。
二路归并排序在合并操作中需要借助较多的辅助空间用于元素复制,大小为 O(n),虽然有方法能克服这个缺点,但其代价是算法会很复杂而且时间复杂度会增加。
1.2排序算法的稳定性判断及改进
从稳定性看:
插入排序、冒泡排序、归并排序和基数排序是稳定的排序算法,
而简单选择排序、快速排序、希尔排序和堆排序都是不稳定的排序算法。
平均时间复杂度为 O(nlog₂n)的稳定排序算法只有归并排序,对于不稳定的排序算法,只需举出一个不稳定的实例即可。
对于排序算法的稳定性,读者应能从算法本身的原理上去理解,而不应拘泥于死记硬背。
1.3更适合采用顺序存储的排序算法
从适用性看:
折半插入排序、希尔排序、快速排序和堆排序适用于顺序存储。
直接插入排序、冒泡排序、简单选择排序、归并排序和基数排序既适用于顺序存储,又适用于链式存储。
1.4根据排序的中间过程判断所采用的排序算法
从过程特征看:
采用不同的排序算法,在一趟或几趟处理后的排序结果通常是不同的,考研题中经常出现给出一个待排序的初始序列和已部分排序的序列,问其采用何种排序算法。
这就要对各类排序算法的过程特征十分熟悉,如冒泡排序、简单选择排序和堆排序在每趟处理后都能产生当前的最大值或最小值,
而快速排序一趟处理至少能确定一个元素的最终位置等。
下表列出了各种排序算法的时空复杂度和稳定性情况,其中空间复杂度仅列举了平均情况的复杂度,因为希尔排序的时间复杂度依赖于增量函数,所以无法准确给出其时间复杂度。
1.5各种排序算法的性质
算法种类 | 时间 |