先围绕枢轴划分
一种两向划分方法先选一个枢轴,从左侧寻找不该留在左边的项,从右侧寻找不该留在右边的项,再交换它们。扫描交叉后,把枢轴放到适当位置;该位置两侧分别满足相应的大小关系,但各侧内部还没有完全有序。
随后只需递归处理枢轴两边。正确性依赖划分后保持的区域约束,以及递归区间严格缩小;若边界处理没有排除已经定位的枢轴,遇到极值或重复键时可能不断处理同一区间。
参考:[1]
期望成本与最坏成本不同
若划分大致均衡,线性扫描分布在对数级递归层中,总成本为O(n log n)。若每次只排除一个元素,剩余部分仍几乎同样大,工作便累加到O(n²);固定拿首项作枢轴的朴素版本可能被已经有序的输入触发这一情形。
先随机打乱,或每次随机选枢轴,可以在相应随机模型下得到O(n log n)期望成本。随机化减少持续极端划分的机会,却不是每个输入和每次随机结果都满足对数深度的确定性保证;实现还要管理调用栈。
参考:[1]
重复键与其他划分方式
当大量键相等时,三向划分把区域分成小于、等于和大于枢轴三段。等值段不必再递归,避免不断重新处理同一批相等内容。两向版本也必须正确处理相等键和扫描终止,否则可能产生不必要工作或错误。
普通原地交换版本通常不稳定,不能保证同键记录维持输入次序。实践中还会对小区间使用插入排序,或采用不同枢轴规则。由划分也能构造只寻找第k小项的选择算法,但那不是把整个数组都排序完成。