C++ 排序算法(4)---快速排序

简介

快速排序是目前各个排序算法中效率优秀的一种排序方法,其采用的任然是分治法的思想,并且快速排序在实际中也是最为常用的。

基本流程

  1. 首先在数组中取一个值作为基准(可以随便取)
    4,3,1,7,3,9,5,6,2
  2. 将比基准小的都放到基准的左边,比基准大的都放到基准的右边,以此将数组分为两部分
    3,1,3,2,4,7,9,5,6
  3. 分别对两个区间重复以上步骤,直到各区间只有一个数
    3,1,3,2,|4|,7,9,5,6
    1,2,3,3,|4|,5,6,7,9

过程非常简单,主要的问题在于第二步的具体实现方式,这里给出一种实现方式

void quicksort_(int a[],int first,int last)//对first到last之间的数据进行一次分区
{
    if(first<last)
    {
        int i=first,l=last,x=a[first];//基准选为第一个数
        while(i<l)
        {
            //小数向前移
            while(i<l&&a[l]>=x)//从后往前查找比基准小的数
                --l;
            if(i<l)//将小于基准的数移动到i所指的位置
                a[i++]=a[l];

            //大数向后移
            while(i<l&&a[i]<=x)//从前往后查找比基准大的数
                ++i;
            if(i<l)//将小于基准的数移动到j所指的位置
                a[l--]=a[i];
        }
        a[i]=x;//将基准移入最后的空位
    }
}
  1. 首先我们用x来保存基准值,此时也可以认为原基准值所在位置(也就是i所指的位置空出)
    这里写图片描述
  2. 此时,i区(小于基准值的区域)出现了一个空位需要一个数来填上,我们就从j区(小于基准值的区域)开始寻找,如果遇到的数大于基准那么就扩大j区的范围,直至遇到小于基准的数,将其移入i区的空缺中。
    这里写图片描述
  3. 之后对i区做相同的处理,一边扩大区域一边寻找合适的值。
    这里写图片描述
  4. 重复以上两步直至i,j两区相遇,再将基准放入最后的空位,此时数组就被分为两组

算法完整代码

void quicksort_(int a[],int first,int last)
{
    if(first<last)
    {
        int i=first,l=last,x=a[first];
        while(i<l)
        {
            while(i<l&&a[l]>=x)
                --l;
            if(i<l)
                a[i++]=a[l];

            while(i<l&&a[i]<=x)
                ++i;
            if(i<l)
                a[l--]=a[i];
        }
        a[i]=x;

        quicksort_(a,first,i-1);//分别对两区域继续分离
        quicksort_(a,i+1,last);
    }
}

void QuickSort(int a[],int n)
{
    quicksort_(a,0,n-1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值