排序算法的简单总结

比较排序

基于插入

1、直接插入排序

概念:理扑克牌。将后面未排好序的数插入到前面已排好的序列中。

时间复杂度:O(n2) O(n) O(n2) (最坏 最好 平均)

空间复杂度(辅助空间):O(1)

稳定

|

发现:接近有序的序列,比较次数小

优化:增量划分组,多次插入排序逐渐接近有序

|

2、希尔排序

概念:增量+分组+插入排序。以i为间隔划分组进行插入排序,i递减。

O(n2) O(n1.3) O(n)

O(1)

不稳定

基于交换

3、冒泡排序

概念:小的数向上冒泡直到遇到小于等于它的。

O(n2) O(n) O(n2)

O(1)

稳定

|

优化:双向进行冒泡,小的放前,大的放后。

|

4、快速排序

概念:双向冒泡排序+分治。以一个数为基准,双向遍历,小的放前,大的放后。再对两边进行相同操作。

O(n2) O(nlogn) O(nlogn)

O(nlogn)用于函数递归栈

不稳定

最坏情况:逆序,退化为冒泡排序

基于选择

5、选择排序

概念:每次选出最小的。

O(n2) O(n2) O(n2)

O(1)

不稳定

|

优化:不通过遍历来找最小的,而是维护一个最小堆。

|

6、堆排序

概念:维护一个最小堆,每次选出最小的的。

O(nlog2n) O(nlog2n) O(nlog2n)

O(1)

不稳定

7、归并排序

概念:向下递归划分组直到每组一个数,再向上合并。

O(nlog2n) O(nlog2n)O(nlog2n)

O(n)

线性排序

8、计数排序

概念:遍历序列,维护一个记录下标数出现次数的数组。序列中数的排序位置即下标小于它的数组前缀和。

O(n)

O(m) m取决于序列中数的范围

稳定

9、桶排序

概念:将数根据映射函数划分至有序的不同桶中,每个桶内部再排序。

O(n+c)

O(n+m)

取决于划分到桶后的排序算法是否稳定

10、基数排序

概念:类似于字符串比大小。从低到最高位,位上的数根据[0,最大基数]进行分组。

O(d(r+n)) O(d(r+n)) O(d(r+n)) O(dr+n) n个记录,d个关键码,关键码的取值范围为r

稳定

常用结论:

最坏(即所有数互相都比过一次)的比较次数为n(n-1)/2

冒泡排序、快速排序、插入排序、希尔排序对数据的有序性敏感

对于序列长度 比较大的随机序列,应选择平均时间复杂度较小的快速排序方法。

参考:

https://www.cnblogs.com/wxisme/p/5243631.html

https://www.cnblogs.com/jaylon/p/5735431.html

https://blog.csdn.net/hr10707020217/article/details/10581371

猜你喜欢

转载自blog.csdn.net/KeeeepGO/article/details/88087480