这绝对是你在处理含有大量重复元素(比如只有 0, 1, 2 组成的数组,或者全是 5 的数组)时最快、最好记的排序模板。

它不需要像传统快排那样担心“指针错车”,也不需要处理恶心的边界。

🧠 核心逻辑:荷兰国旗问题 (Dutch National Flag)

把数组切成三段,就像排列一面三色国旗:

  1. 左边 [l, lt-1]:严格小于 Key
  2. 中间 [lt, gt]:严格等于 Key (不用再递归这里了!)
  3. 右边 [gt+1, r]:严格大于 Key

记忆点: 在一趟排序的过程中

  • [lt , i-1] 这部分永远=key
  • [1,lt-1] ,这部分 永远< key
  • [i,gt] ,这部分是未扫描的部分
  • [gt+1,n], 这部分永远 > key

动画

一趟3路快排 动画

模板代码

[include-code] Error: Failed to read file 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 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 不要陷入死循环

题目