各种内部排序算法的比较及应用
内部排序算法的比较
一般基于三个因素进行对比:时空复杂度,算法的稳定性,算法的过程特征。
从时间复杂度来看:
简单选择排序,直接插入排序和冒泡排序平均情况下的时间复杂度都为O(n^2),且实现过程也比较简单,但直接插入排序和冒泡排序最好情况下的时间复杂度可以达到O(n),而简单选择排序则与序列的初始状态无关。
希尔排序作为插入排序的拓展,对较大规模的排序都可以达到很高的效率,但目前未得出其精确的渐进时间。
堆排序利用了一种称为堆的数据结构,可以在线性时间内完成建堆,且在O(nlog2n)内完成排序过程。
快速排序基于分治的思想,虽然最坏情况下快速排序时间会达到O(n^2),但快速排序平均性能可以达到O(nlog2n),在实际应用中常常优于其他排序算法。
归并排序同样是分治的思想,但由于分割子序列与初始序列排序无关,因此它的最好,最坏和平均时间复杂度均O(nlog2n)。
从空间复杂度来看:
简单选择排序,插入排序,冒泡排序,希尔排序,和堆排序都仅需要借助常数个辅助单元。
快速排序在空间上只有一个小的辅助栈,用于实现递归,平均情况下大小为O(log2n),当然在最坏情况下有可能会增长到O(n),2路归并排序在合并操作中需要借助较多的辅助函数用于元素复制,大小为O(n),虽然有办法可以解决,但其代价是算法会很复杂而且时间复杂度会增加。
从稳定性来看: 插入排序,冒泡排序,归并排序,基数排序是稳定的排序方法,而简单选择排序,快速排序,堆排序,希尔排序都是不稳定的排序算法。平均复杂度是O(nlog2n)的稳定排序只有归并排序。
冒泡排序和堆排序在每趟处理后都能产生当前最大值或最小值,,而快速排序一趟处理就能确定一个元素的最终位置。
各种排序算法的性质
内部排序算法的应用
通常情况下,对排序算法的应用应考虑以下情况。
-
选取排序方法需要考虑的因素:
- 待排序的元素数目n
- 元素本生信息量的大小
- 关键字的结构极其分布情况
- 稳定性的要求
- 语言工具的条件,存储结构及辅助空间的大小
-
排序算法小结
- 若n较小,可采用直接插入排序或简单排序。由于直接插入排序所需的记录移动次数较简单选择排序的多,因而当记录本身信息量较大时,用简单选择排序较好。
- 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。
- 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序,堆排序或归并排序。快速排序被认为是目前基于比较的内部排序方法中最好的方法,当待排序的关键字随机分布时,快速排序的平均时间最短。堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况,这俩种排序都是不稳定的。若要求排序稳定且时间复杂度为O(nlog2n),则可选用归并排序。
- 在基于比较的排序方法中,每次比较俩个关键字的大小之后,仅出现俩种可能的转移,因此可以用一颗二叉树来买描述比较判定过程,由此可以证明,当文件的n个关键字随机分布时,任何借助于比较的排序算法,至少需要O(nlog2n)的时间
- 若n很大,记录的关键字为主较少且可以分解时,采用基数排序较好。
- 当记录本身信息量较大时,为避免耗费大量时间移动记录,可用链表作为存储结构。