文档目录

一、std::sort 内部实现

std::sort 不是单纯的快排,而是内省排序:

// 伪代码
void sort(iterator first, iterator last) {
    if (last - first < 16) {
        insertion_sort(first, last);  // 小数组用插入排序
        return;
    }

    int depth_limit = 2 * log2(last - first);

    intro_sort_loop(first, last, depth_limit);
    // 如果 depth_limit 达到 0,说明快排退化,切换到堆排序
}

void intro_sort_loop(iterator first, iterator last, int depth) {
    while (last - first > 16) {
        if (depth == 0) {
            make_heap(first, last);      // 切换到堆排序
            sort_heap(first, last);
            return;
        }
        depth--;
        iterator cut = partition(first, last);  // 快排分区
        intro_sort_loop(cut + 1, last, depth);  // 递归大的一边
        last = cut;  // 尾递归处理小的一边
    }
}

组合策略:快排(通用最快)+ 堆排(退化保护)+ 插入排序(小数组最优)。

二、面试追问 Q&A

Q1:N 很小时为什么插入排序比快排快? A:快排有函数调用开销(partition 中的循环 + 递归),N 很小时这些开销占比大。插入排序对小于 16 的数组,没有递归,分支预测好,实际更快。

Q2:std::stable_sort 和 std::sort 怎么选? A:不需要稳定就用 std::sort(更快)。需要稳定(相等元素的相对顺序不变)用 std::stable_sort。