快速排序

重新复习一遍算法。

之前有个桶排序和冒泡排序。这两个都比较简单,就先从快排开始,有时间再看一遍。

先讲讲原理:

比如输入的数据是 5 6 2 4 9

先取第一个数5,称这一个是基准数 然后从最后找到第一个比5小的,假设这个下标用j表示。再从第一个数开始找到第一个比基准数大的,假设这个下标用i表示。分别是4和6讲这两个数交换,变成了 5 4 2 6 9。再继续找。(必须j先开始)j到2比基准数小,然后i到2时候和j相遇。表示查找结束,交换基准数和2。变成2 4 5 6 9。现在看起来顺序正好了,但是还不能停止。从5将左右两边分开。左边2 4 5继续再从第一个数开始比较,第一个数2为基准数,j从5开始,i 从2开始。最后还是2 4 5。然后比较之前没比较的右边,6 9 比较。比较6,j从9,i从6开始。j到6与i相遇停止 然后还是6 9.这样一个快速排序完成。代码如下

#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;
    printf("scanf:");
    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]);
    return 0;
}
大家理解了代码之后。想想为什么要从右边开始而不是从左边开始。

然后再出个题目 这里快排是从小到大,如果从大到小排列呢?

其实就改一处就好了。。。与基准数的比较i大于基准数,j小于基准数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值