这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记
什么是最快最强的排序算法?
这时就有聪明的小伙伴想到了~
啊!我知道我知道!肯定是快速排序法!排序杠杠顶!👍👍
嗯?我的评价是:不如堆排法👋👋
害。感觉不如插入排序🙅♂️🙅♀️
笑死,表示只会冒泡排序法2333~😭😭
其实,每种排序法都有其自身的优势和劣势,设想,如果把所有代码的优势都集中起来,那么不就是最快最强的排序算法了么?🚀🚀
打造Go语言的超级排序算法!
当代高质量男性👨 额不 是高质量排序算法是如何设计的呢?👇
根据不同的情况选择不同的算法策略,取长补短,面对不同的实践场景而达到更高的实践性能。
Go、Rust、C ++ 的默认 unstable 排序算法虽然名义上叫快速排序,但其实质是混合排序算法,它们虽然在大部分情况下会使用快速排序算法,但是也会在不同情况下切换到其他排序算法。
再介绍最快的排序算法之前,先简单回顾一下几个常用的基本排序算法。
Insertion Sort 插入排序法
将元素不断插入已经排序好的array中
起始只有一个元素5,其本身是一个有序序列,后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素
优点:最好情况时间复杂度为O(n)
缺点:在平均和最坏的情况下时间复杂度高达O(n²)
Quick Sort 快速排序法
分治思想,不断分割序列直到序列整体有序,选定一个 pivot(轴点)使用pivot分割序列,分成元素比 pivot大和元素比pivot 小两个序列
优点:平均情况的时间复杂度为O(n*logn)
缺点:最坏情况的时间复杂度高达O(n²)
Heap Sort 堆排序
利用堆的性质形成的排序算法,构造一个大顶堆,将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复
优点:最好的情况时间复杂度为O(n*logn)
缺点:最坏的情况时间复杂度为O(n*logn)
比较各个经典算法
插入排序平均和最坏情况时间复杂度都是O(n个2),性能不好
快速排序整体性能处于中间层次
堆排序性能稳定,“众生平等”
但在实际情况中,还会出现许多不同的元素排列情况:
根据序列元素排列情况划分
-
完全随机的情况(random)
-
有序/逆序的情况(sorted/reverse)
-
元素重复度较高的情况(mod8)
在此基础上,还需要根据序列长度的划分
- 可以选择(16/128/1024)的数据长度划分为少量元素、中等量元素和多量元素
ONE YEAR LETER~~ 🤸♂️🤸♀️
经过测试,直接上结论!
所有短序列和元素有序情况下,插入排序性能最好 🚲
在大部分的情况下,快速排序有较好的综合性能 🚗
几乎在任何情况下,堆排序的表现都比较稳定 🚇
参考文献:
打造 Go 语言最快的排序算法 - 掘金 (juejin.cn)
数据结构与算法.pptx - 飞书文档 (feishu.cn)
致谢~