Loading docs/basic/quick-sort.md +10 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,14 @@ void quick_sort(T arr[], const int len) { } ``` ## 内省排序[^ref3] 内省排序(introspective sort)是快速排序和 [堆排序](heap-sort.md) 的结合,由 David Musser 于 1997 年发明。内省排序其实是对快速排序的一种优化,保证了最差时间复杂度为 $O(n\log n)$ 。 内省排序的思路其实很简单,就是限制快速排序最大递归深度为 $\lfloor \log_2n \rfloor$ ,超过限制时就转换为堆排序。这样既保留了快速排序内存访问的局部性,又可以防止快速排序在某些情况下性能退化为 $O(n^2)$ 。 2000 年 6 月,SGI C++ STL 的 stl_algo.h 中 sort()函数的实现采用了内省排序算法。 ## 三路快速排序 三路快速排序(英语:3-way Radix Quicksort)是快速排序和 [基数排序](radix-sort.md) 的混合。它的算法思想基于 [荷兰国旗问题](https://en.wikipedia.org/wiki/Dutch_national_flag_problem) 的解法。 Loading @@ -96,3 +104,5 @@ void quick_sort(T arr[], const int len) { [^ref1]: [C++ 性能榨汁机之局部性原理 - I'm Root lee !](http://irootlee.com/juicer_locality/) [^ref2]: [算法实现/排序/快速排序 - 维基教科书,自由的教学读本](https://zh.wikibooks.org/wiki/%E7%AE%97%E6%B3%95%E5%AE%9E%E7%8E%B0/%E6%8E%92%E5%BA%8F/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F) [^ref3]: [introsort](https://en.wikipedia.org/wiki/Introsort) Loading
docs/basic/quick-sort.md +10 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,14 @@ void quick_sort(T arr[], const int len) { } ``` ## 内省排序[^ref3] 内省排序(introspective sort)是快速排序和 [堆排序](heap-sort.md) 的结合,由 David Musser 于 1997 年发明。内省排序其实是对快速排序的一种优化,保证了最差时间复杂度为 $O(n\log n)$ 。 内省排序的思路其实很简单,就是限制快速排序最大递归深度为 $\lfloor \log_2n \rfloor$ ,超过限制时就转换为堆排序。这样既保留了快速排序内存访问的局部性,又可以防止快速排序在某些情况下性能退化为 $O(n^2)$ 。 2000 年 6 月,SGI C++ STL 的 stl_algo.h 中 sort()函数的实现采用了内省排序算法。 ## 三路快速排序 三路快速排序(英语:3-way Radix Quicksort)是快速排序和 [基数排序](radix-sort.md) 的混合。它的算法思想基于 [荷兰国旗问题](https://en.wikipedia.org/wiki/Dutch_national_flag_problem) 的解法。 Loading @@ -96,3 +104,5 @@ void quick_sort(T arr[], const int len) { [^ref1]: [C++ 性能榨汁机之局部性原理 - I'm Root lee !](http://irootlee.com/juicer_locality/) [^ref2]: [算法实现/排序/快速排序 - 维基教科书,自由的教学读本](https://zh.wikibooks.org/wiki/%E7%AE%97%E6%B3%95%E5%AE%9E%E7%8E%B0/%E6%8E%92%E5%BA%8F/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F) [^ref3]: [introsort](https://en.wikipedia.org/wiki/Introsort)