基本思想:
1、先从数列中选取一个数作为基准数
2、分区过程,将比基准数打的数全部放到它的右边,小于或等于基准数的放到它的左边
3、再对左右分区重复第二步,知道各区间只有一个数
例如对数列 6,1,2,7,9,3,4,5,10,8
为了方便,选择数列的第一个作为基准数。
此刻,i = 6, j = 8, 先从序列的两端开始探测,先从右往左找一个小于6的数,找到了就在那个数上方停下,然后i再从左往右找一个大于6的数。然后交换。
第一次交换后得:
6,1,2,5,9,3,4,7,10,8
j继续向前,找一个小于6的数,找到了就在那个数上方停下,然后i再从左往右找一个大于6的数。然后交换。
第二次交换后得:
6,1,2,5,4,3,9,7,10,8
然后j向前,找到3,同时i向右,与j相遇,第一次探测结束。6和3交换位置。
左右分区类似思想。
#include <stdio.h>
int a[101],n;//定义全局变量,这两个变量需要在子函数中使用
void quicksort(int left,int right)
{
int i,j,t,key;
if(left>right)
return;
key=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//顺序很重要,要先从右边开始找
while(a[j]>=key && i<j)
j--;
//再找右边的
while(a[i]<=key && i<j)
i++;
//交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=key;
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]);
//输出输入后的结果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
quicksort(1,n); //快速排序调用
//输出排序后的结果
for(i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
结果: