内省排序

入门

工程实践中最常用的排序算法,理解"混合策略"的价值。

用你自己的数组跑一遍

AlgoAnim · 内省排序
速度
待机
// 源代码
1void introSort(int arr[], int n) {
2    int depthLimit = 2 * log2(n);
3    function<void(int, int, int)> sort = [&](int lo, int hi, int depth) {
4        if (hi - lo < 16) {
5            insertionSort(arr + lo, hi - lo + 1);
6            return;
7        }
8        if (depth == 0) {
9            make_heap(arr + lo, arr + hi + 1);
10            sort_heap(arr + lo, arr + hi + 1);
11            return;
12        }
13        int pivot = partition(arr, lo, hi);
14        sort(lo, pivot - 1, depth - 1);
15        sort(pivot + 1, hi, depth - 1);
16    };
17    sort(0, n - 1, depthLimit);
18}

复杂度分析

时间 O(n log n)
空间 O(log n)
最优 O(n log n)
最坏 O(n log n)

算法讲解

内省排序以快排为主,当递归深度超过阈值时切换为堆排序。

当分区大小小于阈值时,使用插入排序(对小数组更高效)。

这种混合策略避免了快排的最坏情况,同时保持了平均性能。

C++ STL 的 std::sort 和 Java 的 Arrays.sort 都使用类似策略。