数据结构和算法(排序)课程学习笔记 | 青训营笔记

52 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

排序算法

常见语言标准库内置算法

  • Python - timsort
  • C++ - introsort
  • Rust - pdqsort

GO的排序算法 —— GO(<=1.18) - intrsort

经典排序算法

Insertion Sort 插入排序

时间复杂度

  • 最好情况 O(n)
  • 平均情况 O(n^2)
  • 最坏情况 O(n^2)

缺点: 平均和最坏情况的时间复杂度高达 O(n^2) 优点: 最好情况时间复杂度为 O(n)

Quick Sort 快速排序

分治思想,不断分割序列直到序列整体有序

  • 选定一个pivot(轴点)
  • 使用pivot分割序列,分成元素比pivot大和元素比pivot小两个序列

时间复杂度

  • 最好情况 O(n*logn)
  • 平均情况 O(n*logn)
  • 最坏情况 O(n^2)

缺点: 最坏情况的时间复杂度高达 O(n^2) 优点: 平均情况的时间复杂度为 O(n*logn)

Heap Sort 堆排序

利用堆的性质形成的排序算法

  • 构造一个大顶堆
  • 将根节点(最大元素)交换到最后一个位置,调整整个堆,如此反复

时间复杂度

  • 最好情况 O(n*logn)
  • 平均情况 O(n*logn)
  • 最坏情况 O(n*logn)

缺点: 最好情况的时间复杂度高达 O(nlogn) 优点: 最坏情况的时间复杂度为 O(nlogn)

简单总结

  • 插入排序平均和最坏情况时间复杂度都是 O(n^2),性能不好
  • 快速排序整体性能处于中间层次
  • 堆排序性能稳定,“众生平等”

一种更好的算法 pdqsort

pdqsort(pattern-defeating-quicksort)

pdqsort是一种不稳定的混合排序算法,它的不同版本被应用在C++,BOOST,Rust以及Go 1.19中。即对常见的序列类型做了特殊的优化,使得在不同条件下都拥有不错的性能

简单说明: pdqsort算法结合三种排序方法的优点

  • 对于短序列(小于一定程度)我们采用插入排序
  • 其他的情况下,使用快速排序来保证整体的性能
  • 但当快速排序表现不佳时,使用堆排序来保证最坏情况下时间复杂度仍然为 O(n*logn)