排序算法笔记

39 阅读3分钟

直接插入排序

基本思想

在要排序的一组数中,假设前面 n-1(n>=2)个数已经是排好序的,现在要把第 n 个数插入到前面的有序数中,使得这 n 个数也是排好序的。如此反复循环,直到全部排好顺序。

复杂度

  • 最优情况:O(n),当输入数组就是排好序的时候
  • 最差情况:O(n^2),当输入数组为倒序时

适用情况

比较适合用于少量元素的数组

快速排序

基本思想

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序序列分成两部分,一部分比基准元素小、一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分

复杂度

  • 最优情况:O(nlog2n\log_2 n)
  • 最差情况:O(n^2),当输入数组已排序时
  • 随机化后的情况:期望为O(nlog2n\log_2 n)

总结

方法平均时间复杂度最好情况时间复杂度最坏情况时间复杂度空间复杂度(辅助存储)稳定性
直接插入O(n^2)O(n)O(n^2)O(1)稳定
快速排序O(nlog2n\log_2 n)O(nlog2n\log_2 n)O(n^2)O(nlog2n\log_2 n)不稳定
基数排序稳定

选择策略:

  1. n较小(如n<=50),可采用直接插入或简单选择排序。当记录规模较小时,直接插入排序较好;否则因为简单选择移动的记录数少于直接插入,应选简单选择排序为宜。

  2. 若文件初始状态为基本正有序,则应选用直接插入、冒泡或随机的快速排序为宜。

  3. 若n较大,则应采用时间复杂度为O(nlog2n\log_2 n)的排序方法:快速排序、堆排序或归并排序。

    快速排序在目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。

    堆排序所需的空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。但是,上述这两种排序都是不稳定的。

    若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。