做这题重点解决:快排、堆排序
20225/5/2复盘:无法ac
在sort函数中漏了循环终止条件
leetcode 题解第30行 if(low < high) {
如果没有的话, 1 2 3,假设pivot为1,那么永远无法终止,左区间sort(0, -1) sort(0, -1)。。。
堆排序待更新
// 快排
int partition(vector<int>& nums, int low, int high) {
int pivot = nums[low];
while(low < high) {
while(nums[high] > pivot && low < high) {
high--;
}
nums[low] = nums[high];
while(nums[low] < pivot && low < high) {
low++;
}
nums[high] = nums[low];
}
// 此时 low = high
nums[low] = pivot;
return low;
}
void quicksort(vector<int>& nums, int low, int high) {
// 注意这里,递归终止条件,若没有,则一直递归调用sort(nums, 0, 0)
if(low < high) {
int pivotpos = partition(nums, low, high);
quicksort(nums, low, pivotpos - 1);
quicksort(nums, pivotpos + 1, high);
}
}
leetcode题解为
// srand((unsigned)time(NULL))
// rand() % 10 随机生成 0~9间的数字
class Solution {
public:
// 快排
int partition(vector<int>& nums, int low, int high) {
// rand() % (high - low + 1) 生成的数范围 与 low + high 区间长度相等
// +low之后即与原来的范围相同
int i = rand () % (high - low + 1) + low;
swap(nums[i], nums[low]);
int pivot = nums[low];
while(low < high) {
// 注意一定要使用 >= 如果只是>,数组的每个值相等情况下,low和high无法移动,一直循环
while(nums[high] >= pivot && low < high) {
high--;
}
nums[low] = nums[high];
while(nums[low] <= pivot && low < high) {
low++;
}
nums[high] = nums[low];
}
// 此时 low = high
nums[low] = pivot;
return low;
}
void sort(vector<int>& nums, int low, int high) {
// 递归终止条件
if(low < high) {
int pivotpos = partition(nums, low, high);
sort(nums, low, pivotpos - 1);
sort(nums, pivotpos + 1, high);
}
}
vector<int> sortArray(vector<int>& nums) {
// 随机种子
srand((unsigned)time(NULL));
sort(nums, 0, nums.size() - 1);
return nums;
}
};
堆排序