快速排序的原理:
QUICKSORT(A,p,r)
if p<r
then q <- PARTITION(A,p,r)
QUICKSORT(A,p,q-1)
QUICKSORT(A,q+1,r)
算法导论第7章快速排序给出的切分算法:
PARTITION(A,p,r)
x <- A[r]
i <- p-1
for j <- p to r-1
if A[j] <- x
then i <- i+1
exchange A[i]<->A[j]
exchange A[i+1]<->A[r]
return i+1;
最初由C.A.R.Hoare设计的切分算法(划分算法):
HOARE-PARTITION(A,p,r)
x <- A[p]
i <- p-1
j <- r+1
while TRUE
do repeat j <- j-1
until A[j] <= x
repeat i <- i+1
until A[i] >= x
if i < j
then exchange A[i] <-> A[j]
else return j;
两种切分算法的实现:
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int hoare_partition(int a[],int left,int right)
{
int i,j,pivot;
pivot = a[left];
i = left - 1;
j = right + 1;
while(1)
{
do
{
j--;
}while(a[j]>pivot);
do
{
i++;
}while(a[i]<pivot);
if(i<j)
swap(a+i,a+j);
else
return j;
}
}
int partition(int a[],int left,int right)
{
int i,j;
int pivot = a[right];
i = left - 1;
for(j=left;j<right;j++)
{
if(a[j]<=pivot)
{
i++;
swap(a+i,a+j);
}
}
swap(a+i+1,a+right);
return i+1;
}
Hoare切分的变形版本:
int Partition(int arr[], int low, int high)
{
int i, j, pivot;
i = low, j = high, pivot = arr[low];
while(i < j)
{
while(i < j && arr[j] >= pivot) --j;
if(i < j)
swap(arr[i++], arr[j]);
while(i < j && arr[i] <= pivot) ++i;
if(i < j)
swap(arr[i], arr[j--]);
}
return j; //返回基准元素位置
}
得到的快速排序算法为
void qSort(int a[],int left,int right)
{
if(left<right){
int idx = partition(a,left,right);
qSort(a,left,idx-1);
qSort(a,idx+1,right);
}
}