十种排序算法简略总结

十种排序算法简略总结

首先是 4 种基于比较的排序算法:

冒泡排序:过程就像名字一样,每一趟就有一个“泡”(元素)冒到顶部,如下图。

img

图片引用自百度百科 “冒泡排序”

https://baike.baidu.com/item/冒泡排序/4602306

​ 一共需要进行 n-1 趟,每一趟需要与 n-i 个元素进行比较,如果该元素大于待比较的元素,那么进行交换,

因此效率太低,O(n2)。

选择排序:每次选择序列中最小的元素一一保存下来,如下图。

img

图片引用自河边一支柳博客《选择排序》

https://blog.csdn.net/cjf_iceking/article/details/7914554

​ 一共需要进行 n-1 趟,每一趟需要遍历 n-i 个元素保存最小数,因此效率较低,O(n2)。

插入排序:每次选择待排序第一个元素进行插入,插入到适合的位置,如下图。

img

图片引用自百度百科 “插入排序”

https://baike.baidu.com/item/插入排序

​ 需要进行 n-1 趟,每一趟需要进行插入,向左边遍历找到第一个小于该元素的位置进行插入,

因此平均效率比较低,O(n2)。(不过当序列基本有序时很快

希尔排序:缩小增量排序,是插排的改善。具体过程如下图。

img

图片引用自[dreamcatcher-cx] 图解排序算法(二)之希尔排序

https://www.cnblogs.com/chengxiao/p/6104371.html

​ 当刚开始的时候,序列组多量少,此时无序,但是元素少,较小的元素可以一次跨越大范围到前面,不需要一个个比较,效率较高。

​ 当希尔排序进行到后期,序列组少量多,但是这个时候各个组中已经基本有序,进行插入排序的效率很高,移动次数少。

​ 因此希尔排序的时间复杂度介于 O(nlgn) ~ O(n2) 之间,与分组方式有很大关系。

下面是 3 种基于分治的排序算法:

快速排序: 工业最常用,分区方法很重要,具体内容参考《快速排序与寻找第k小值问题》

《快速排序与寻找第k小值问题》

https://blog.csdn.net/qq_41765114

在这里插入图片描述 平均 时间复杂度为 O(nlgn)。

归并排序:空间换时间,重视合并,具体过程如下图。
在这里插入图片描述
​ 将 n 个元素分成含有 n/2 个元素的子序列,对两个子序递归地排序,之后合并这两个子序列。

​ 时间复杂度为 O(nlgn)。

堆排序:利用二叉堆 ≈ 插入排序+二分查找,常熟因子大。

这里写图片描述

图片引用自 [askunix_hjh] 堆排序

https://blog.csdn.net/m0_37925202/article/details/80818561

​ 1.堆化,反向调整使得每个子树都是大(小)顶堆;

​ 2.按序输出元素,把堆顶和最末元素对调,然后调整堆顶元素;

​ 时间复杂度为 O(nlgn)。

最后说的是以空间换时间的排序算法:

计数排序:速度最快,但是可能会浪费空间。

​ 假如需要排序 2 5 4 6 8 7 9 2

index 0 1 2 3 4 5 6 7 8 9
cnt 0 0 2 0 1 1 1 1 1 1

​ 排序的结果就是 2 2 4 5 6 7 8 9

​ 如果需要排序的是 1 10 1000 100000 1 10 那么会浪费很多的空间。

​ 时间复杂度为 O(n+k)。

桶排序:条件严格的Hash,将数据按序分散在表中,如下图。

img

图片引用自百度百科 “桶排序”

https://baike.baidu.com/item/桶排序/4973777

​ 对于数据的分布很看重,若原始数据分布均匀那么适合使用,时间复杂度为 O(n) ~ O(nlgn)。

③ 基数排序:对于大量的数据适合使用,又快又稳(int型),如下图。

img

图片引用自[skywang12345] 基数排序

https://www.cnblogs.com/skywang12345/p/3603669.html

按照位数进行分组排序,时间复杂度为 O(kn)。

最后给出一张表
排序算法 平均 最好 最坏 空间 排序方式 稳定性
冒泡排序 O(n2) O(n) O(n2) O(1) In-place
选择排序 O(n2) O(n2) O(n2) O(1) In-place ×
插入排序 O(n2) O(n) O(n2) O(1) In-place
希尔排序 O(nlgn) O(n(lgn)2) O(n(lgn)2) O(1) In-place ×
归并排序 O(nlgn) O(nlgn) O(nlgn) O(n) Out-place
快速排序 O(nlgn) O(nlgn) O(n2) O(lgn) In-place ×
堆排序 O(nlgn) O(nlgn) O(nlgn) O(1) In-place ×
计数排序 O(n+k) O(n+k) O(n+k) O(k) Out-place
桶排序 O(n+k) O(n+k) O(n2) O(n+k) Out-place
基数排序 O(nk) O(nk) O(nk) O(n+k) Out-place

【END】感谢观看

发布了44 篇原创文章 · 获赞 17 · 访问量 9122

猜你喜欢

转载自blog.csdn.net/qq_41765114/article/details/88374060