Skip to content

快速排序

约 311 字大约 1 分钟

2024-11-03

思路

给定一个数组,设定一个方法,返回一个数组,参数为:一个数组 nums,要处理区域的左下标 left 和右下标 rigtht

取范围内的第一个元素 (nums[left]) 为 key(可以任取,但取第一个比较方便),循环一下步骤:

  • 判断右下标指向的值与 key 的大小,若大于,则 right 左移,直到遇到比 key 小的数
    • 若 left 和 right 未重叠,nums[left] = nums[right] (对于第一次的左下标的值已经被 key 记录了)
  • 接着比较左下标与 key 的大小,若小于,则 left 右移,直到遇到比 key 大的数
    • 若 left 和 right 未重叠,nums[right] = nums[left]

直到 left 和 right重叠,将重叠位置的值设为 key,至此完成以 key 为分界的两份相对有序的子区域

分别以这两个子区域为规模递归

代码

int[] quickSort(int[] nums, int left, int right) {
        if (left < right) {
            int key = nums[left];
            int l = left, r = right;
            right -= 1;

            while (left < right) {
                while (nums[right] >= key && right - left >= 1) {
                    --right;
                }
                if (right - left >= 1) {
                    nums[left] = nums[right];
                }

                while (nums[left] < key && right - left >= 1) {
                    ++left;
                }
                if (right - left >= 1) {
                    nums[right] = nums[left];
                }
            }
            nums[left] = key;
            quickSort(nums, l, right);
            quickSort(nums, left + 1, r);
        }

        return nums;
    }