【详解】经典算法之快速排序

在学习快速排序前,我们要明白快速排序的原理。
该方法的基本思想是:

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);

}

猜你喜欢

转载自blog.csdn.net/qq_43249043/article/details/95885471