这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
主要内容
介绍生产环境使用的算法和数据结构,然后重点从排序算法这个在课本上耳熟能详的算法分类开始,一步步打造出一个在工程实践领域性能一流的排序算法
背景
数据结构和算法几乎存在于程序开发中的所有地方
经典排序算法
lnsertion Sort插入排序
解释:将元素不断插入已经排序好的array中
- 起始只有一个元素5,其本身是一个有序序列
- 后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素
- 缺点 平均和最坏情况的时间复杂度高达O(n^2)
- 优点 最好情况时间复杂度为O(n)
Quick Sort快速排序
解释:分治思想,不断分割序列直到序列整体有序
-
选定一个pivot(轴点)
-
使用pivot分割序列,分成元素比 pivot大和元素比 pivot小两个序列
-
缺点 最坏情况的时间复杂度高达O(n^2)
-
优点 平均情况的时间复杂度为O(n*logn)
Heap Sort 维排序
解释:利用堆的性质形成的排序算法
-
构造一个大顶堆
-
将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复
-
缺点 最好情况的时间复杂度高达O(n*logn)
-
优点 最坏情况的时间复杂度为O(n*logn)
pdqsort
是一种不稳定的混合排序算法,它的不同版本被应用在C++BOOST、Rust 以及Go 1.19中。它对常见的序列类型做了特殊的优化.使得在不同条件下都拥有不错的性能 结合了上述三种排序的优点
问题
高性能的排序算法是如何设计的?
根据不同情况选择不同策略,取长补短
生产环境中使用的的排序算法和课本上的排序算法有什么区别?
理论算法注重理论性能,例如时间、空间复杂度等。生产环境中的算法需要面对不同的实践场景,更加注重实践性能
Go语言(<=1.18)的排序算法是快速排序么?
实际一直是混合排序算法,主体是快速排序。Go <=1.18时的算法也是基于快速排序,和 pdqsort的区别在于fallback时机、pivot选择策略、是否有针对不同pattern优化等