什么是最快最强的排序法? | 青训营笔记

232 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

什么是最快最强的排序算法?

这时就有聪明的小伙伴想到了~

啊!我知道我知道!肯定是快速排序法!排序杠杠顶!👍👍

嗯?我的评价是:不如堆排法👋👋

害。感觉不如插入排序🙅‍♂️🙅‍♀️

笑死,表示只会冒泡排序法2333~😭😭

其实,每种排序法都有其自身的优势和劣势,设想,如果把所有代码的优势都集中起来,那么不就是最快最强的排序算法了么?🚀🚀


打造Go语言的超级排序算法!

当代高质量男性👨 额不 是高质量排序算法是如何设计的呢?👇

根据不同的情况选择不同的算法策略,取长补短,面对不同的实践场景而达到更高的实践性能。

Go、Rust、C ++ 的默认 unstable 排序算法虽然名义上叫快速排序,但其实质是混合排序算法,它们虽然在大部分情况下会使用快速排序算法,但是也会在不同情况下切换到其他排序算法。

再介绍最快的排序算法之前,先简单回顾一下几个常用的基本排序算法。


Insertion Sort 插入排序法

image.png

将元素不断插入已经排序好的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)

图解快速排序 - 掘金 (juejin.cn)

致谢~