【1】单向扫描
PARTITION(A, p, r)
x ← A[r] //以最后一个元素,A[r]为主元
i ← p - 1
for j ← p to r - 1 //注,j从p指向的是r-1,不是r。
do if A[j] < x
then i ← i + 1
exchange A[i] <-> A[j]
exchange A[i + 1] <-> A[r]
return i + 1
【2】双向替换(右小左大直接交换)
PARTITION(A, p, r)
x ← A[p]
i ← p - 1
j ← r + 1
while TRUE
do repeat j ← j - 1 //找小
until A[j] < x
do repeat i ← i + 1 //找大
until A[i] > x
if i < j
then exchange A[i] <-> A[j]
else return j
【3】双向补缺(左右轮流补空:首为轴,小补左,大补右)