快速排序

快速排序的设计思想如下:
找出中间值作为基准值k,想办法把所有比 ‘k’ 小的都放右边,所有比‘k’大的都放左边,然后缩小start end的范围,一个是从 start->mid-1, 一个是mid+1->end

int getMid(int *data,int s,int e)
{
    int m = (s+e)/2;

    //    4    2   1
    if(data[s] > data[m])
        //交换
        swap(data+s,data+m);
    //   2    4   1

    if(data[m] > data[e])
        swap(data+m,data+e);
    //2   1   4

    if(data[s] > data[m])
        swap(data+s,data+m);
    //1   2   4

    swap(data+m,data+e);

    return data[e]; //这就是mid值,把它放到后面便于确定它最终位置
}

void q_sort(int *a,int start,int end)
{
    //终止条件,start == end: 序列里面只有一个元素
    if(start >= end)
        return;

    //对start  end  mid简单排序, 返回中间值(后期判断使用)
    //这只是个代理中间值
    int mid = getMid(a,start,end);

    int i = start-1;
    int j = end;
    while(1){
        while(a[++i] < mid);
        while(a[--j] >= mid);//note:>=  ...mid=end时会交换时都会消除...待续下次看的时候注意一下

        if(i > j)
            break;
        swap(a+i,a+j);
    }

    swap(a+i,a+end);

    //out_array(a,8);

    //再排 分开的两个序列
    //i一定会停到指向mid的那个地方while(a[++i] < mid);, 即:i所指的值的右边都比它小,而左边都比他大
    q_sort(a,start,i-1);
    q_sort(a,i+1,end);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值