重新开始之快排

好久没写博客了
最近打算把之前的一些学习笔记发到博客上
今天就用经典的快排做开头吧

快排是一种在一般情况下性能稳定的排序算法,在排序序列基本有序的情况下会退化成O(n^2)的效率 。
好像自从上了研究生就没写过快排了 ,今天照着印象里的方法用c++写了一个,代码实现一定不算优雅,但是逻辑应该是清晰的。

void QuickSort(std::vector<int>& nums, int begin , int end){
    if(end - begin + 1 < 2) return ;

    int pivotVal = nums[begin]; //保存pivot的值
    int left = begin;
    int right = end;
    bool ChooseWay = true;
    while(left < right){
        if(ChooseWay){ //从右往左
            if(nums[right] >= pivotVal) {
                right --;
                continue;
            }
            nums[left] = nums[right]; // nums[left]的位置由nums[right]的值覆盖
            left ++ ;                 // left 向右移动一位,作为下次移动的开始
            ChooseWay = false;
        }
        else{
            if(nums[left] <= pivotVal){
                left ++;
                continue;
            }
            nums[right] = nums[left];// nums[right]的位置由nums[left]的值覆盖
            right --;
            ChooseWay = true;
        }
    }
    // 退出循环时, left = right ,这个下标的左侧都比pivotVal小,右侧都比pivotVal大
    nums[left] = pivotVal;
    QuickSort(nums,begin,left-1); //开始到 pivot的左侧
    QuickSort(nums,left+1,end);
}

递归应该遵循三步的方式来写, 首先要想递归的退出条件,不然会陷入无限递归,然后爆栈。
这里的条件是子序列的长度大于等于2时继续递归,小于2即返回。
ChooseWay用于选择此时应该移动的下标,true为右,false为左。
其他的逻辑就不赘述了。

int main(){
    std::vector<int> nums{2,3,49,6,34,5,33,55,66,33,33,75};
    QuickSort(nums,0,nums.size()-1);
    for(auto i : nums){
        std::cout<< i <<" ";
    }
    std::cout<<std::endl;
}

用下列程序测试如下结果

C:\Users\stan\Desktop\Cpp-Primer-Plus-6th-main\quicksort.exe
2 3 5 6 33 33 33 34 49 55 66 75 

进程已结束,退出代码为 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值