harness-sdk 实战指南:从执行编排到可观测性的工程化落地
2026/11/4 10:56:42
以下是常见排序算法的性能对比及选择依据总结:
| 排序方法 | 时间复杂度 | 辅助空间 | 稳定性 |
|---|---|---|---|
| 直接插入 | O(n²) | O(1) | 稳定 |
| 简单选择 | O(n²) | O(1) | 不稳定 |
| 冒泡排序 | O(n²) | O(1) | 稳定 |
| 希尔排序 | O(n^1.3) | O(1) | 不稳定 |
| 快速排序 | O(n log n) 平均 | O(log n) | 不稳定 |
| 堆排序 | O(n log n) | O(1) | 不稳定 |
| 归并排序 | O(n log n) | O(n) | 稳定 |
| 基数排序 | O(d(n + rd)) | O(rd) | 稳定 |
当 n 较小时(如 n < 50):
当关键字基本有序时:
当 n 大且关键字位数少(如整数、字符串等可分解位):
当 n 较大时:
快速排序采用分治法:
设每次划分耗时 O(n),若能均匀分割,则递归深度为 O(log n),总时间复杂度为:
T(n) = 2T(n/2) + O(n) → O(n log n)这就是平均情况的时间复杂度。
在随机数据中,假设我们随机选择 pivot或使用“三数取中”等策略,则每次划分大概率接近均分。数学期望下,每层平均处理所有元素一次,递归树深度约为 log n 层。
因此,平均时间复杂度为 O(n log n)。
当每次选择的 pivot 是当前数组中的最大值或最小值时,会导致极端不均衡的划分:
T(n) = T(n−1) + O(n) → O(n²)例如:对[1,2,3,4,5]使用首元素为 pivot,每次划分都极不平衡。
| 方法 | 效果 |
|---|---|
| 随机化 pivot | 使最坏情况具有偶然性,期望性能稳定 |
| 三数取中法(mid of three) | 减少在有序数据上选到极值的概率 |
| 双轴快排(如 Java 中的 Dual-Pivot Quicksort) | 提高分区效率,尤其对重复元素多的数据 |
✅总结:
快速排序平均性能优秀是因为划分较均衡,递归深度小;而最坏情况发生在每次划分极度不平衡时(如已排序数据),导致递归深度达 n,从而使总时间退化为 O(n²)。