各排序算法的时空复杂度及稳定性
类别 排序方法 平均时间复杂度 最坏时间复杂度 辅助空间 稳定性
插入 直接插入排序 O(n2) O(n2) O(1) 稳定
希尔排序 O(n1.3) O(n2) O(1) 不稳定
选择 直接选择排序 O(n2) O(n2) O(1) 不稳定
堆排序 O(nlogn) O(nlogn) O(1) 不稳定
交换 冒泡排序 O(n2) O(n2) O(1) 稳定
快速排序 O(nlogn) O(n2) O(nlogn) 不稳定
  归并排序 O(nlogn) O(nlogn) O(n) 稳定

 

一、什么是排序算法的稳定性

假设在数列中存在a[ i ] = a[ j ]。若在排序之前,a[ i ]在a[ j ]前面;并且排序之后,a[ i ]仍然在a[ j ]前面。则这个排序算法是稳定的!

 

二、选择哪种排序算法

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

  • 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
  • 堆排序:所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。
  • 归并排序:它有一定数量的数据移动,所以我们可能要与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。

(2)当n较大,内存空间允许,且要求稳定性 =》归并排序。 
(3)当n较小,可采用直接插入或直接选择排序。

  • 直接插入排序:当元素分布有序时,直接插入排序将大大减少比较次数和移动记录的次数。
  • 直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序。

(4)一般不使用或不直接使用传统的冒泡排序。