快速排序笔记

快速排序

快排的时间复杂度为O(nlogn),它是原地排序,空间复杂度为O(1)。快速排序它的思想是每次按照一个基准(通常为待排序数组的第一个元素),将待排序数组划分成两个子数组,左边小于基准值,右边大于基准值。在对两个子数组重复上诉操作,直到子数组的长度为1。

快排流程

  • 找到划分左右两个子数组的基准值放置的下标pivot,然后再对(left,pivot-1)和(pivot+1,right)这两个子数组进行快排。
  • 递归结束条件:子数组的长度为<=1。

快排代码

寻找pivot下标

将右边小于pivot的换到左边,将左边大于pivot的换到右边。

int find_pivot(vector<int> & nums,int left,int right){
        //左闭右闭
        int pivot=nums[left];
        while(left<right){
            //从数组的右边开始,如果nums[right]大于pivot,递减right,直到nums[right]小于等于pivot,说明nums[right]应该放到左边
            while( right> left && nums[right] >= pivot){
                right--;
            }
            //将nums[right]换到左边
            nums[left]=nums[right];

            //从数组的左边开始,如果nums[left]小于pivot,递加left,直到nums[left]大于pivot,说明nums[left]应该放到右边
            while(right>left && nums[left] <=pivot){
                left++;
            }
            //将nums[left]换到右边
            nums[right]=nums[left];
        }
        nums[left]=pivot;
        return left;
    }

递归快排

找pivot,然后对左右两边子数组进行快排。

void fastSort(vector<int>& nums,int left,int right){
        if(right-left<1){
            return ;
        }
        int pivot=find_pivot(nums,left,right);
        fastSort(nums,left,pivot-1);
        fastSort(nums,pivot+1,right);
    }

快排入口函数

vector<int> sortArray(vector<int>& nums) {
        //快速排序
        fastSort(nums,0,nums.size()-1);
        return nums;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值