编程练习题:快速排序

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

    void quicksort(vector& 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交换到中间位置,并且递归排序区间不包含这个位置,否则可能会是出现递归死循环,程序运行报栈溢出的错误。

你可能感兴趣的:(编程练习题)