几种排序算法的总结
- 1.冒泡排序:简单的排序算法,时间复杂度O(n^2),对少量排序有效,排序效率最低,需要一趟一趟对比,一般作为其他排序算法的对比。
- 2.插入排序:插入排序是对冒泡排序的改进,比冒泡快两倍,一般用于数据量不大于1000,或者重复排序超过200,或者部分已经排序的序列。
- 3.希尔排序:希尔排序是将数据分成几组,每组之内在进行插入排序,最后对所有数据进行一次插入排序,以减少数据交换和移动次数。平均效率O(n*logn)。
希尔排序比冒泡排序快5倍,比插入排序快约2倍,比快排、归并排序、堆排序慢很多。适合数据量不大于5000,速度不是特别重要的场合。对数据量较小的数列重复排序是非常好的。
- 4.选择排序:时间复杂度O(n^2),与冒泡排序都是排序算法的初级阶段,应用中较少使用。
- 5.归并排序:先分解要排序的序列,直到只有一个组的时候,再一次合并。时间复杂度O(n*logn)。
归并排序比堆排序还要快一点,因此比快排、希尔也要快。但是需要内存空间大,比堆排序需要多一倍的内存空间,因为需要一个额外的数组。
- 6.快速排序:快排是一个就地排序,分而治之,大规模递归的排序。一般情况下,快排比大部分排序算法都要快。某些情况下部分排序算法比快排快,但就通常意义上说快排就是快。
快排是递归的,所以不适合内存非常有限的情况。
- 7.堆排序:堆排序会将所有数据建成一个堆,时间复杂度O(n*logn)。
堆排序不需要大量递归或者多维数组暂存数据,适合数据量非常巨大的序列,快排、归并都需要递归来设计算法,数据量非常大的时候,容易发生堆栈溢出。
堆排序适合大量数据排序,百万级别,特别是在大量数据中找出前N大或前N小的排序。一般找出前N大,需要用小堆;找出前N小,需要用大堆。
- 8.总结:
排序法 |
平均时间 |
最差情形 |
稳定度 |
额外空间 |
备注 |
冒泡 |
O(n2) |
O(n2) |
稳定 |
O(1) |
n小时较好 |
交换 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
选择 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
插入 |
O(n2) |
O(n2) |
稳定 |
O(1) |
大部分已排序时较好 |
基数 |
O(logRB) |
O(logRB) |
稳定 |
O(n) |
B是真数(0-9),R是基数(个十百) |
Shell |
O(nlogn) |
O(ns) 1<s<2 |
不稳定 |
O(1) |
s是所选分组 |
快速 |
O(nlogn) |
O(n2) |
不稳定 |
O(nlogn) |
n大时较好 |
归并 |
O(nlogn) |
O(nlogn) |
稳定 |
O(1) |
n大时较好 |
堆 |
O(nlogn) |
O(nlogn) |
不稳定 |
O(1) |
n大时较好 |