partial_sort比全排序快,因其只保证前N个最小(或最大)元素有序,采用堆与排序混合策略,时间复杂度为O(M log N);而全排序为O(M log M)。
partial_sort 为什么比全排序快
partial_sort 不对整个容器排序,只保证前 N 个元素有序且是全局最小(或最大)的 N 个。它底层用的是「堆 + 排序」混合策略:先建大小为 N 的最大堆(求最小 N 个)或最小堆(求最大 N 个),再遍历剩余元素,逐个比较替换堆顶。时间复杂度是 O(M log N),其中 M 是容器总长度 —— 当 N 时,明显优于 sort 的 O(M log M)。
取前 N 个最大元素的正确写法
默认 partial_sort 求最小 N 个;要取最大 N 个,必须传自定义比较器。常见错误是直接写 greater() 却没注意迭代器范围:
- 目标区间必须是前
N个位置:partial_sort(first, first + N, last, greater()) - 如果
N > distance(first, last),行为未定义 —— 务必先检查N是否越界 - 若容器支持随机访问(如
vector),性能稳定;对list等仅双向迭代器的容器,partial_sort不可用,得换partial_sort_copy或手写堆
和 make\_heap + pop\_heap 对比哪个更快
手动维护堆(如 make_heap + pop_heap)理论上也能取 top N,但实际更慢、更易错: