pdqsort(I) | 青训营笔记

77 阅读1分钟

前言

各个常用的编程语言的排序算法通常都是快排或者快排的变种形式。

Python-timsort C++-introsort Rust-pdqsort

Go(<= 1.18)-introsort (>1.18)-pdqsort

本文介绍一下常用的排序算法和 pdqsort。

经典排序算法

插入排序

image.png

排序过程: 将元素不断插入到已经排好序的 array 中,即不断比较,直到找到第一个比自己小(大)的元素。

时间复杂度:

  • 最好情况:O(n)(数组已经有序)
  • 平均情况:O(n^2)
  • 最坏情况:O(n^2)

快速排序

image.png

排序过程: 分治思想,不断分割序列直到序列整体有序

  • 选一个 pivot
  • 通过 pivot 分割序列,分成比 pivot 大和比 pivot 小的两个子序列。

时间复杂度:

  • 最好情况:O(n*logn)(每次选取 pivot 都能够选到中位数)
  • 平均情况:O(n*logn)
  • 最坏情况:O(n^2)

堆排序

image.png

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

  • 构造一个大顶堆
  • 将根节点(最大元素)与堆中最后一个元素(假如位置为 n )交换,此时调整大小为 (n - 1) 的堆
  • 反复这个过程

时间复杂度:

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

经典排序算法特征

  • 插入排序平均和最坏情况都是 O(n^2),性能不好
  • 快速排序整体性能处于中间层次,大多数情况性能较好
  • 堆排序性能稳定