设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:
①分解:
在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。
注意:
划分的关键是要求出基准记录所在的位置pivotpos。划分的结果可以简单地表示为(注意pivot=R[pivotpos]):
R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
其中low≤pivotpos≤high。
②求解:
通过递归调用快速排序对左、右子区间R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
完整的代码如下:
#include<stdio.h>
#include<stdlib.h>
//调用顺序:quicksort-->qsort-->partitions
int partitions(int a[],int low,int high)
{
int pivotkey=a[low]; //基准
//a[0]=a[low];
while(low<high)
{
while(low<high && a[high]>=pivotkey)
--high;
a[low]=a[high];
while(low<high && a[low]<=pivotkey)
++low;
a[high]=a[low];
}
//a[low]=a[0];
a[low]=pivotkey;
return low;
}
void qsort(int a[],int low,int high)
{
int pivotkey;
if(low<high)
{
//递归调用
pivotkey=partitions(a,low,high);
qsort(a,low,pivotkey-1);
qsort(a,pivotkey+1,high);
}
}
void quicksort(int a[],int n)
{
qsort(a,0,n);
}
//简单示例
int main(void)
{
int i,a[11]={20,11,12,5,6,13,8,9,14,7,10};
printf("排序前的数据为:\n");
for(i=0;i<11;i++)
printf("%d ",a[i]);
printf("\n");
quicksort(a,10);
printf("排序后的数据为:\n");
for(i=0;i<11;i++)
printf("%d ",a[i]);
printf("\n");
system("pause");
return 0;
}