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

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

排序法平均时间最坏时间最好时间稳定性额外空间备注
冒泡法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表。

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

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


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值