C++快速排序 (个人觉得先把直接插入排序,变种插入排序,折半插入排序,希尔排序都学一下再来学快排)

//快速排序
//流程:用两个哨兵 一个在头一个在尾 
//以第一个数为基准数 
//一定要尾哨兵先往前寻找比基准数小的  头哨兵往后寻找比基准数大的 寻找到之后再交换 然后继续寻找 
//前提是头哨兵一定要小于尾哨兵
//如果两个哨兵指的是同一个位置的数 那么就拿这个数与基准数互换
//然后就基于基准数把原来的数组分成了两部分  然后分别再用这样的方法 
//就这样一直分割 到最后就会分成诺干个小数组 然后就用这个方法让他们自己进行排序
//其实最后就是再这个函数里面再套用这个函数 
void insert5(int data[],int left,int right)
{
    if(left > right)//这一步是关键 如果不写这一步 最后就会无限循环 
        return ;
    int swap = data[left]; //设置基准数  
    int i = left,j = right; //因为第一次循环之后基准数会变化 所以用i和j代替两个哨兵名称 
    int t;//用来交换的中间变量 
    while(i != j)  //前提是两个i<j 如果i=j 那么就要进行交换 所以这里直接不等于就好了 
    {
        while( i < j && data[j] > swap)     //尾哨兵找比基准数小的 
            j--;                         //其实尾哨兵也可以等于基准数 因为再定义的时候基准数可以为任意数 
        while(i < j && data[i] <= swap)  //头哨兵找比基准数大的  头哨兵一开始的位置就在基准数位置上 
            i++;
        if(i < j) //找到相应的位置后进行交换 
        {
             t = data[i];
            data[i] = data[j];
            data[j] = t;
        }
    }
    data[left] = data[i];//这里注意 要把基准数和两个哨兵都在的这个位置的数互换 
    data[i] = swap;
    insert5(data,left,i-1);//这个就是套用自身了  可见被分成了两个数组(基准数变化的原因)
    //分成两个数组之后每个小数组的基准数就发生变化了  
    insert5(data,i+1,right); //1变2  2变4  4变8 .....这样原数组就会被分成2*n个数组,这样每个小数组再排序的效率就提高了 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值