/* 快速排序主函数 */ voidqsort(vector<int>& nums){ // 将 nums 数组随机打乱 shuffle(nums); int lo = 0, hi = nums.size() - 1; quicksort(nums, lo, hi); }
/* 快速排序核⼼逻辑 */ voidquicksort(vector<int>& nums, int lo, int hi){ if (lo >= hi) return; int p = partition(nums, lo, hi); // 现在 nums[lo..p-1] 都⼩于 nums[p], // 且 nums[p+1..hi] 都⼤于 nums[p] quicksort(nums, lo, p - 1); quicksort(nums, p + 1, hi); }
/* 分界点索引 p 的确定 */ intpartition(vector<int>& nums, int lo, int hi){ int i = lo + 1, j = hi; // 将 nums[lo] 作为默认分界点 p while (true) { while (i < hi && nums[i] <= nums[lo]) { ++i; } while (lo < j && nums[j] >= nums[lo]) { --j; } if (i >= j) break; //此时, nums[i] > p && nums[j] < p,需交换 nums[i] 和 nums[j] //保证 nums[lo..i] < p < nums[j..hi] swap(nums[i], nums[j]); } //将 p值(nums[lo])交换到正确的位置 swap(nums[lo], nums[j]); return j; }
//主函数 intfindKthLargest(vector<int>& nums, int k){ random_shuffle(nums.begin(), nums.end());// ⾸先随机打乱数组 int l = 0, r = nums.size() - 1, target = nums.size() - k; while (l <= r) { int mid = quickSelection(nums, l, r); if (mid == target) { return nums[mid]; } if (mid > target) { r = mid - 1; } else { l = mid + 1; } } return nums[l]; }
//辅助函数 - 快速选择 intquickSelection(vector<int>& nums, int l, int r){ int i = l + 1, j = r; while (true) { while (i < r && nums[i] <= nums[l]) { ++i; } while (l < j && nums[j] >= nums[l]) { --j; } if (i >= j) break; swap(nums[i], nums[j]); } swap(nums[l], nums[j]); return j; }