从待排序区间中任取一个记录(通常是第一个)作为枢纽记录(即基准记录),所有比基准记录小的记录一律放在其左侧,所有比基准记录大的记录一律放在右侧,形成两个子表;枢纽记录放在两个子表中间的位置(也是枢纽记录最终的位置)。然后对两个子表重新选择枢纽记录,重复上述操作。
#include <stdio.h>
#define N 200
int a[N];
int quick(int i,int j)
{
while (i<j)
{
//对当前待排序从右侧(j指向的记录)开始向左侧进行扫描,直到找到第一个关键值小于枢纽记录关键值记录
while (i<j&&a[0]<=a[j])
j--;
a[i]=a[j]; //将比枢纽记录小的关键值交换到左侧
//对当前待排序从左侧(i指向的记录)开始向右侧进行扫描,直到找到第一个关键值大于枢纽记录关键值记录
while (i<j&&a[0]>=a[i])
i++;
a[j]=a[i]; //将比枢纽记录大的关键值交换到右侧
}
a[i]=a[0]; //
return i;
}
void sort(int i,int j)
{
int mid;
if (i<j)
{
//一般将待排序区间最左侧值作为枢纽记录
mid=quick(i,j);
a[0]=a[i]; //枢纽记录保存在a[0]
sort(i,mid-1);
a[0]=a[mid+1]; //枢纽记录保存在a[0]
sort(mid+1,j);
}
}
int main()
{
int n,x,y;
int i;
scanf("%d",&n); //排序的数据量
for (i=1; i<=n; i++)
scanf("%d",a+i);
a[n+1]=n;
scanf("%d %d",&x,&y); //排序的起始位置和终止位置
a[0]=a[x];
sort(x,y);
for (i=1; i<=n; i++)
printf("%3d",a[i]);
return 0;
}