什么都不说,直接举例比上代码容易理解,有一组数:6,1,2,7,9,3,4,5,10,8
以6为基数,左边角标为i,右边为j,从右边开始往左走,遇到比6小的停下,角标变为j,这里开始就是5,然后i再向右走,遇到比6大的停下,这里就是7,角标变为i,交换角标i和j对应的值,变成:6,1,2,5,9,3,4,7,10,8;这时候再继续j先向左走,遇到了4停下,角标变为j,i也同样,这时候再交换角标i和j的值,变为:6,1,2,5,4,3,9,7,10,8;j再同样,这时候遇到了3,i也同样,但这时候i和j相遇了,所以把基数6和这时候j遇到的值交换,变成:3,1,2,5,4,6,9,7,10,8。这样第一小步就完成了,之后再按照同样的步骤,分别变换6左边的和右边的。理解完后,我们再上代码
#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右边开始找
while(a[j]>=temp && i<j)
j--;
//再找右边的
while(a[i]<=temp && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//继续处理左边的,这里是一个递归的过程
quicksort(i+1,right);//继续处理右边的 ,这里是一个递归的过程
}
int main()
{
int i,j,t;
//读入数据
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n); //快速排序调用
//输出排序后的结果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
getchar();getchar();
return 0;
}