排序算法大集合
https://blog.****.net/weixin_41317985/article/details/79461929
1.比较排序
A.冒泡排序
- 最佳情况:T(n) = O(n)
- 最差情况:T(n) = O(n2)
- 平均情况:T(n) = O(n2)
B.选择排序
- 最佳情况:T(n) = O(n2)
- 最差情况:T(n) = O(n2)
- 平均情况:T(n) = O(n2)
C.插入排序
- 最佳情况:输入数组按升序排列。T(n) = O(n)
- 最坏情况:输入数组按降序排列。T(n) = O(n2)
- 平均情况:T(n) = O(n2)
D.希尔排序
- 最佳情况:T(n) = O(nlog2 n)
- 最坏情况:T(n) = O(nlog2 n)
- 平均情况:T(n) =O(nlog n)
E.归并排序
- 最佳情况:T(n) = O(n)
- 最差情况:T(n) = O(nlogn)
- 平均情况:T(n) = O(nlogn)
F.快速排序
- 最佳情况:T(n) = O(nlogn)
- 最差情况:T(n) = O(n2)
- 平均情况:T(n) = O(nlogn)
G.堆排序
- 最佳情况:T(n) = O(nlogn)
- 最差情况:T(n) = O(nlogn)
- 平均情况:T(n) = O(nlogn)
可以看出比较排序在大数据量的情况排名:
时间排序上来看: 1.归并排序 2.堆排序 3.快速排序
但归并排序需要开辟额外的空间去储存正在调整排序的数组
如果对于空间和时间都有要求,建议使用快速和堆排序
归并排序思路(递归):
[2,1,4,3,9,6,5,8]
第一步分割数组
[2,1,4,3] [9,6,5,8]
[2,1][4,3] [9,6][5,8]=>直到每个数组都不能再分割
第二步排序最底部子数组开始排序然后合并数组,顺序如下
[2,1] =>[1,2]
[2,1][4,3] =>[1,2,3,4]
[9,6] =>[6,9]
[5,8] =>[5,8]
[9,6][5,8] =>[5,6,8,9]
[2,1][4,3] [9,6][5,8] =>[1,2,3,4,5,6,8,9]
2.非比较排序
对于大量的数据速度并不一定比比较排序快
A.计数排序
- 最佳情况:T(n) = O(n+k)
- 最差情况:T(n) = O(n+k)
- 平均情况:T(n) = O(n+k)
要求:必须是整数,且给出接受数组为排序数组的最小到最大的范围如,排序数组是1-9,则参考数组必须要1-9
速度快于任何比较排序,但面临数量大的数组,会占有大量内存和时间
B.桶排序
- 最佳情况:T(n) = O(n+k)
- 最差情况:T(n) = O(n+k)
- 平均情况:T(n) = O(n2)
-
说明:桶排序简单来说是计数排序的参考数组的优化,缩小参考数组聚集成为桶,然后对桶再排序,再合并桶数组为结果
-
如[1,2,3,4,5,6,7,8,9] =>[1,2,3]+ [4,5,6]+[7,8,9]
C.基数排序
- 最佳情况:T(n) = O(n * k)
- 最差情况:T(n) = O(n * k)
- 平均情况:T(n) = O(n * k)
- 说明:依据于数字的位数上的数字大小放到桶里,再拿出来合并为新排序数组,从地位到高位
- 如: 下图所示