快速排序
约 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;
}