OSDN Git Service

fix(quick-sort): remove duplicate, small refactor
authorXeonacid <h.dwwwwww@gmail.com>
Mon, 19 Oct 2020 09:11:09 +0000 (17:11 +0800)
committerGitHub <noreply@github.com>
Mon, 19 Oct 2020 09:11:09 +0000 (17:11 +0800)
docs/basic/quick-sort.md

index 46cadad..ca9af2d 100644 (file)
 
 第三步中的序列已经分别有序且第一个序列中的数都小于第二个数,所以直接拼接起来就好了。
 
-### 线性找第 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
@@ -76,6 +58,16 @@ void quick_sort(T arr[], const int len) {
 }
 ```
 
+## 性质
+
+### 稳定性
+
+快速排序是一种不稳定的排序算法。
+
+### 时间复杂度
+
+快速排序的最优时间复杂度和平均时间复杂度为 $O(n\log n)$ ,最坏时间复杂度为 $O(n^2)$ 。
+
 ## 优化
 
 ### 朴素优化思想
@@ -136,7 +128,9 @@ void quick_sort(T arr[], const int len) {
 
 从 2000 年 6 月起,SGI C++ STL 的 `stl_algo.h` 中 `sort()` 函数的实现采用了内省排序算法。
 
-## 线性找第 k 大的数
+## 应用
+
+### 线性找第 k 大的数
 
 找第 $k$ 大的数(K-th order statistic),最简单的方法是先排序,然后直接找到第 $k$ 大的位置的元素。这样做的时间复杂度是 $O(n\log n)$ ,对于这个问题来说很不划算。