快速排序的描述
快排的伪代码:
QUICK_SORT(A,p,r){
if p<r
q = PARTITION(A,p,r)
QUICK_SORT(A,p,q-1)
QUICK_SORT(A,q+1,r)
}
初始调用传入的参数是QUICK_SORT(A,1,A.length)。
PARTITION的伪代码:
PARTITION(A,p,r){
x = A[r];
i = p-1;
for j=p to r-1
if A[j]<=x
i = i+1
exchange A[i] with A[j]
exchange A[i+1] with A[r]
return i+1
}
算法维持几个指针变量,p和r分别指向数组的首尾元素,i为比基准元素x小的最后一个元素,j为比基准元素大的最后一个元素的下一个。
也就是说,选取A[r]为基准元素(紫色),下标在[p,i]区间的元素(粉色部分)都小于等于基准元素x,下标在[i+1,j-1]区间的元素(绿色部分)都大于基准元素x,下标位于区间[j,r-1]的元素(白色部分)则是还没有被排序的元素。
PARTITION程序需要维持这样几个下标,使程序在执行时一直满足上面的性质。
下面是一个例子:
快速排序的性能
最坏情况划分:最坏情况莫过于每次都产生的是0:(n-1)的划分,此时算法运行时间的递归式为:
T(n)=T(n−1)+T(