数据结构与算法|青训营笔记

156 阅读2分钟

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

主要内容

介绍生产环境使用的算法和数据结构,然后重点从排序算法这个在课本上耳熟能详的算法分类开始,一步步打造出一个在工程实践领域性能一流的排序算法

背景

数据结构和算法几乎存在于程序开发中的所有地方

经典排序算法

lnsertion Sort插入排序

解释:将元素不断插入已经排序好的array中

  • 起始只有一个元素5,其本身是一个有序序列
  • 后续元素插入有序序列中,即不断交换,直到找到第一个比其小的元素 image.png
  • 缺点 平均和最坏情况的时间复杂度高达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优化等