Unverified Commit 9d6c25ac authored by Margatroid's avatar Margatroid Committed by GitHub
Browse files

Update quick-sort.md and stl-sort.md (#1512)



Update quick-sort.md and stl-sort.md

Co-authored-by: default avatar24OI-bot <15963390+24OI-bot@users.noreply.github.com>
parents 46a6a9fe 54691e6e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@

其实,快速排序没有指定应如何具体实现第一步,不论是选择 m 的过程还是划分的过程,都不是只有一种实现方法。

注意,一般我们说的快速排序的时间复杂度是平均为 $O(n\log n)$ ,最坏是 $O(n^2)$ ,只不过实践中几乎不可能达到最坏情况。
一般我们说的快速排序的时间复杂度是平均为 $O(n\log n)$ ,最坏是 $O(n^2)$ ,实践中几乎不可能达到最坏情况。且因为快速排序的内存访问遵循局部性原理,多数情况下快速排序的表现大幅优于堆排序等其他复杂度为 $O(n \log n)$ 的排序算法。

其实,在选择 m 的过程中使用[Median of Medians](https://en.wikipedia.org/wiki/Median_of_medians)算法,就可以保证最坏时间复杂度为 $O(n\log n)$ ,但是由于其过于复杂,实践中一般不使用。

@@ -39,3 +39,5 @@
<https://stackoverflow.com/questions/22339240/what-algorithms-are-used-in-c11-stdsort-in-different-stl-implementations>

<https://en.cppreference.com/w/cpp/algorithm/sort>

<http://irootlee.com/juicer_locality/>
+2 −2
Original line number Diff line number Diff line
## sort

C 函数模板库实现了快速排序,即 `stdlib.h` 当中的 `qsort`
C 标准库实现了快速排序,即 `stdlib.h` 当中的 `qsort`

但在 OI 相关比赛当中,更为常见的库排序函数是 C++ `algorithm` 库中的 `std::sort` 函数。

@@ -24,7 +24,7 @@ std::sort(a, a + n);

## nth_element

作用是找到选定区间内第 $k$ 大的数,并将所有比它小的数与比它大的数分别置于两侧,返回它的地址。
作用是找到选定区间内第 $k$ 大的数,并将所有比它小的数与比它大的数分别置于两侧,返回它的地址。

原理是未完成的快速排序