快速排序
这绝对是你在处理含有大量重复元素(比如只有 0, 1, 2 组成的数组,或者全是 5 的数组)时最快、最好记的排序模板。
它不需要像传统快排那样担心“指针错车”,也不需要处理恶心的边界。
🧠 核心逻辑:荷兰国旗问题 (Dutch National Flag)
把数组切成三段,就像排列一面三色国旗:
- 左边
[l, lt-1]:严格小于 Key - 中间
[lt, gt]:严格等于 Key (不用再递归这里了!) - 右边
[gt+1, r]:严格大于 Key
记忆点: 在一趟排序的过程中
[lt , i-1]这部分永远=key[1,lt-1],这部分 永远< key[i,gt],这部分是未扫描的部分[gt+1,n], 这部分永远> key
动画
模板代码
[include-code] Error: Failed to read file
ENOENT: no such file or directory, open '/home/runner/work/rbook_nunjucks/rbook_nunjucks/book/base/quicksort/code/base/quick_sort_3way_part.cpp'
code/base/quick_sort_3way_part.cpp.ENOENT: no such file or directory, open '/home/runner/work/rbook_nunjucks/rbook_nunjucks/book/base/quicksort/code/base/quick_sort_3way_part.cpp'
传统快排
[include-code] Error: Failed to read file
ENOENT: no such file or directory, open '/home/runner/work/rbook_nunjucks/rbook_nunjucks/book/base/quicksort/code/base/quick_sort_tranditional.cpp'
code/base/quick_sort_tranditional.cpp.ENOENT: no such file or directory, open '/home/runner/work/rbook_nunjucks/rbook_nunjucks/book/base/quicksort/code/base/quick_sort_tranditional.cpp'
基本思想
如何把保证两个quick_sort 不要陷入死循环