编程练习题:快速排序

写了一个快速排序,各种采坑,写对不容易
正确解法:

    void quicksort(vector<int>& nums, int begin, int end) {
        if (begin >= end) {
            return;
        }
        int i = begin;
        int j = end;
        //设置哨兵值
        int pivot = nums[i];
        while (begin < end) {
            //首先从哨兵对面开始,及结尾处开始,找到第一个小于等于pivot的位置end,此循环结束后end右边(不包含end)的所有元素都是大于pivot的 
            while (begin < end && nums[end] > pivot) {
                end--;
            }
            //从begin开始,找到第一个大于pivot的位置,此循环结束后begin左边(不包含begin)的所有元素都是小于等于pivot的
            while (begin < end && nums[begin] <= pivot) {
                begin++;
            }
            //交换begin、end的值,交换完成后,begin左边(包含begin)的所有元素都是小于等于pivot的,end右边(包含end)的所有元素都是大于pivot的 
            int temp = nums[begin];
            nums[begin] = nums[end];
            nums[end] = temp;
        }
        //此时begin和end相等, 将pivot替换到中间位置begin, 使得nums[begin] = pivot, 这样begin左边的元素都是小于等于pivot的,begin右边的元素都是大           于pivot的
        int temp = nums[begin];
        nums[begin] = pivot;
        nums[i] = temp;
        //begin左边的元素递归排序
        quicksort(nums, i, begin - 1);
        //begin右边的元素递归排序
        quicksort(nums, begin + 1, j);
    }

需要注意的坑:
1)begin < end 不能写成begin <= end, 否则可能到时数组越界
2)最后需要将pivot交换到中间位置,并且递归排序区间不包含这个位置,否则可能会是出现递归死循环,程序运行报栈溢出的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值