各种排序算法性能之间的比较

今天总结一下各种常见的排序算法的时间性能、空间性能以及适用的场景。

排序法 平均时间 最坏时间 最好时间 稳定性 额外空间 备注
冒泡法 O(n*n) O(n*n)
O(n) 稳定 O(1) n小时较好(算法比较简单)
插入法 O(n*n)
O(n*n)
O(n)
稳定
O(1) 大部分已排序时较好
直接选择 O(n*n)
O(n*n)
O(n*n)
不稳定
O(1) n小时较好(算法比较简单)
快排 O(n*logn) O(n*n)
O(n*logn)
不稳定
O(logn) n大时较好,基本有序时反而不好
堆排序 O(n*logn)
O(n*logn)
O(n*logn)
不稳定
O(1)
n大时较好
归并排序 O(n*logn)
O(n*logn)
O(n*logn)
稳定
O(n) n大时较好
希尔排序 O(n*logn)
O(n*logn)
与步长相关 不稳定
O(1)
n小时较好(算法较复杂)
桶排序 O(n)
O(n)
O(n)
稳定
不确定,与元素
范围大小有关

基数排序 O(logrB)
O(logrB)
O(logrB)
稳定 O(n)

B是真数(0-9),R是基数(个十百)
















对于时间复杂度为O(nlogn)的算法,常见的有快排、堆排序以及归并排序。其中,快排的时间效率最高,但是在数据本身基本有序的时候反而不好,时间性能比较不稳定。而堆排序是一个稳定的O(nlogn)算法,但是在一般情况下要比快排的效率低。因此在强调时间性能的稳定性的时候可以采用堆排序。快速排序的空间复杂度体现在栈的深度,而归并排序的空间复杂度体现在算法执行中一直维持着O(n)的辅助空间。

希尔排序比冒泡排序快5倍,比插入排序大致快2倍。希尔排序比起QuickSort,MergeSort,HeapSort慢很多。但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。

上面所述的这些排序都是基于元素之间的比较进行的,不能突破O(n*logn)的时间复杂度。桶排序和基数排序都是非基于比较的排序,因此可以打破O(n*logn)的时间限制,但是数据元素相对于基于比较的排序方法是受到限制的,例如元素的大小范围是限定的。

桶排序是常见的排序中最快的,但是空间消耗非常大,而且只适合于数值区间确定的整数。个人感觉有点像是把数值作为键值的一个最简单的hash表。

基数排序是一种对多元组排序的有效方法,具体实现要用到计数排序或桶排序。

相对于快速排序、堆排序等基于比较的排序算法,计数排序、桶排序和基数排序限制较多,不如快速排序、堆排序等算法灵活性好。但反过来讲,这三种线性排序算法之所以能够达到线性时间,是因为充分利用了待排序数据的特性,如果生硬得使用快速排序、堆排序等算法,就相当于浪费了这些特性,因而达不到更高的效率。线性排序算法使用最重要的是,充分利用数据特殊的性质,以达到最佳效果。


你可能感兴趣的:(c/c++基础)