写了一个快速排序,各种采坑,写对不容易
正确解法:
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交换到中间位置,并且递归排序区间不包含这个位置,否则可能会是出现递归死循环,程序运行报栈溢出的错误。