算法学习点滴-排序之快速排序

排序算法十分常用,快速排序效率较高而理解复杂,今天就来谈谈它。

百度百科的解释较为饶人,贴出如下:

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

通俗的话来说:

1.选择一个基准数;

2.通过数组内赋值,使得基准数填在准确的位置,同时其左边比它小,右边比它大;

3.对第二步中的准确值左右分区重复1-2。

举个例子:

a[5]={4,5,3,8,1}

1.选择基准数为int base = 4, i = 0 ,j = 4 ;//萝卜被拔出

a[5]={4,5,3,8,1}

2.从右至左寻找是否有比base更适合a[0]这个“小号坑”,发现j=4时适合,即填入,此时

a[5]={1,5,3,8,1}  

3.从左至右寻找是否有比base更适合a[4]这个“大号坑”,发现i=2时适合,即填入,此时

a[5]={15,3,8,5}

4.从右至左寻找是否有比base更适合a[1]这个“小号坑”,发现j=2时适合,即填入,此时

a[5]={1,3,3,8,5}

5.没人比基准更适合这个坑了,填入,判定条件“i = = j”,此时

a[5]={1,3,4,8,5}

以上完成一轮,左右再分区递归即可。


void quick_sort(int s[],int l,int r)
{
    if (l < r)
    {
        int i=l,j=r, base=s[l];//拔出萝卜留下坑
        while(i<j)          //
        {
            while(i<j&&s[j]>= base) // 从右向左找第一个小于x的数
                j--;
            if(i<j)
                s[i++]=s[j];    //拔出,填坑

            while(i<j&&s[i]< base) // 从左向右找第一个大于等于x的数
                i++;
            if(i<j)
                s[j--]=s[i];    //拔出,填坑
        }
        s[i]= base;     //base填入正确位置
        quick_sort(s,l,i-1); // 递归调用
        quick_sort(s,i+1,r);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值