前言
各个常用的编程语言的排序算法通常都是快排或者快排的变种形式。
Python-timsort C++-introsort Rust-pdqsort
Go(<= 1.18)-introsort (>1.18)-pdqsort
本文介绍一下常用的排序算法和 pdqsort。
经典排序算法
插入排序
排序过程: 将元素不断插入到已经排好序的 array 中,即不断比较,直到找到第一个比自己小(大)的元素。
时间复杂度:
- 最好情况:
O(n)(数组已经有序) - 平均情况:
O(n^2) - 最坏情况:
O(n^2)
快速排序
排序过程: 分治思想,不断分割序列直到序列整体有序
- 选一个
pivot - 通过
pivot分割序列,分成比pivot大和比pivot小的两个子序列。
时间复杂度:
- 最好情况:
O(n*logn)(每次选取pivot都能够选到中位数) - 平均情况:
O(n*logn) - 最坏情况:
O(n^2)
堆排序
排序过程: 利用堆的性质形成的排序算法:
- 构造一个大顶堆
- 将根节点(最大元素)与堆中最后一个元素(假如位置为 n )交换,此时调整大小为 (n - 1) 的堆
- 反复这个过程
时间复杂度:
- 最好情况:
O(n*logn) - 平均情况:
O(n*logn) - 最坏情况:
O(n*logn)
经典排序算法特征
- 插入排序平均和最坏情况都是
O(n^2),性能不好 - 快速排序整体性能处于中间层次,大多数情况性能较好
- 堆排序性能稳定