Quicksort Basics
Quicksort 是一种排序算法,它选择一个元素(枢轴)并重新排序数组,形成两个分区,使得小于枢轴的所有元素都在它之前,而所有元素都在之后。然后将该算法递归地应用于分区,直到对列表进行排序。
**1. Lomuto 分区方案机制:
此方案选择一个 pivot,它通常是数组中的最后一个元素。该算法维护索引以将枢轴放在变量 i 中,并且每次找到小于或等于 pivot 的元素时,此索引都会递增,并且该元素将放置在 pivot 之前。
partition(A, low, high) is
pivot := A[high]
i := low
for j := low to high – 1 do
if A[j] ≤ pivot then
swap A[i] with A[j]
i := i + 1
swap A[i] with A[high]
return i
快速排序机制:
quicksort(A, low, high) is
if low < high then
p := partition(A, low, high)
quicksort(A, low, p – 1)
quicksort(A, p + 1, high)
快速排序示例: https://i.stack.imgur.com/UWJZY.gif
**2. Hoare 分区方案:
它使用从被分区的数组的末端开始的两个索引,然后朝向彼此移动,直到它们检测到反转:一对元素,一个大于或等于枢轴,一个更小或相等,这是错误的相对于彼此的顺序。然后交换倒置的元素。当索引满足时,算法停止并返回最终索引。Hoare 的方案比 Lomuto 的分区方案更有效,因为它平均减少了三倍的交换,并且即使所有值都相等,它也可以创建高效的分区。
quicksort(A, lo, hi) is
if lo < hi then
p := partition(A, lo, hi)
quicksort(A, lo, p)
quicksort(A, p + 1, hi)
划分 :
partition(A, lo, hi) is
pivot := A[lo]
i := lo - 1
j := hi + 1
loop forever
do:
i := i + 1
while A[i] < pivot do
do:
j := j - 1
while A[j] > pivot do
if i >= j then
return j
swap A[i] with A[j]