第三步中的序列已经分别有序且第一个序列中的数都小于第二个数,所以直接拼接起来就好了。
-### 线性找第 k 大的数
-
-找第 $k$ 大的数(K-th order statistic),最简单的方法是先排序,然后直接找到第 $k$ 大的位置的元素。这样做的时间复杂度是 $O(n\log n)$ ,对于这个问题来说很不划算。事实上存在时间复杂度 $O(n)$ 的解法。
-
-考虑快速排序的划分过程,在快速排序的「划分」结束后,数列 $A_{p} \cdots A_{r}$ 被分成了 $A_{p} \cdots A_{q}$ 和 $A_{q+1} \cdots A_{r}$ ,此时可以按照左边元素的个数( $q - p + 1$ )和 $k$ 的大小关系来判断是只在左边还是只在右边递归地求解。
-
-可以证明,在期望意义下,程序的时间复杂度为 $O(n)$ 。
-
-## 性质
-
-### 稳定性
-
-快速排序是一种不稳定的排序算法。
-
-### 时间复杂度
-
-快速排序的最优时间复杂度和平均时间复杂度为 $O(n\log n)$ ,最坏时间复杂度为 $O(n^2)$ 。
-
### 实现(C++)[^ref2]
```cpp
}
```
+## 性质
+
+### 稳定性
+
+快速排序是一种不稳定的排序算法。
+
+### 时间复杂度
+
+快速排序的最优时间复杂度和平均时间复杂度为 $O(n\log n)$ ,最坏时间复杂度为 $O(n^2)$ 。
+
## 优化
### 朴素优化思想
从 2000 年 6 月起,SGI C++ STL 的 `stl_algo.h` 中 `sort()` 函数的实现采用了内省排序算法。
-## 线性找第 k 大的数
+## 应用
+
+### 线性找第 k 大的数
找第 $k$ 大的数(K-th order statistic),最简单的方法是先排序,然后直接找到第 $k$ 大的位置的元素。这样做的时间复杂度是 $O(n\log n)$ ,对于这个问题来说很不划算。