在学习快速排序前,我们要明白快速排序的原理。
该方法的基本思想是:
1.选出一个【中轴数】(默认是第一个)
2.将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.重复第二步,直到中轴数左边和右边都变成中轴数(递归)
单纯讲难以理解,我们直接看输出来看说明细节
OJ 8642
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
第一趟:1 4 2 0 3 5 9 6 7 8
第二趟:0 1 2 4 3 5 9 6 7 8
第三趟:0 1 2 4 3 5 9 6 7 8
第四趟:0 1 2 3 4 5 9 6 7 8
第五趟:0 1 2 3 4 5 8 6 7 9
第六趟:0 1 2 3 4 5 7 6 8 9
第七趟:0 1 2 3 4 5 6 7 8 9
上面加粗就说明那个数字已经变成中轴数了。
第一趟的时候5是中轴数,我们要让他的左边都是比他小的数字,右边都是比他大的数字。要怎么实现呢?我们可以这样,定义j为最右边数字的下标,i为最左边的,
1.从最右边开始,找比5小的,j–,找到了就交换位子,1<=>5
2.再从最前面往后找,找到比5大的数字,i++,找到了8,再和5换一次位子,5<=>8,
3.再从刚刚j在的位子从后往前找,找比5小的,再交换位子……
一直重复上面的步骤,直到i=j,5就在 i和j为下标的位子上
第一趟就是 1<=>5 5<=>8 2<=>5 9<=>5 5<=>3 交换5次而成
让后再递归,让5左右两边都重复这种操作就行
ps:因为我是在递归过程中输出每趟结果的,所以输出结果就是先排完左边再排完右边
#include<stdio.h>
#include<stdlib.h>
int len;
int Partition(int a[],int low,int high)
{
int i=low,j=high,x=a[i],t;
while(i<j)
{
if(i<j&&x<=a[j]) j--;
t=a[i];a[i]=a[j];a[j]=t;
if(i<j&&x>=a[i]) i++;
t=a[i];a[i]=a[j];a[j]=t;
}
for(j=1;j<=len;j++) printf("%d ",a[j]);
printf("\n");
return i;
}
void Qsort(int a[],int low,int high)
{
if(low<high)
{
int key=Partition(a,low,high);
Qsort(a,low,key-1);
Qsort(a,key+1,high);
}
}
main()
{
int i,a[100],n,t,j,x;
scanf("%d",&n); len=n;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
Qsort(a,1,n);
}