classSolution { public: intpartition(vector<int>& nums, int left, int right){ int i = left, j = right;
while (i < j) { while (i < j && nums[j] <= nums[left]) { j--; } while (i < j && nums[i] >= nums[left]) { i++; } swap(nums[i], nums[j]); } swap(nums[left], nums[i]);
return i; }
intquickSelect(vector<int>& nums, int left, int right, int k){ int pivotIndex = partition(nums, left, right); int rank = pivotIndex - left + 1; // 计算主元在当前子数组中的排名
if (rank == k) { return nums[pivotIndex]; // 主元就是第 k 个最大的元素 } elseif (rank < k) { // 第 k 个最大的元素在主元右侧的子数组中 returnquickSelect(nums, pivotIndex + 1, right, k - rank); } else { // 第 k 个最大的元素在主元左侧的子数组中 returnquickSelect(nums, left, pivotIndex - 1, k); } }
intfindKthLargest(vector<int>& nums, int k){ int n = nums.size(); returnquickSelect(nums, 0, n - 1, k); } };
// 三数取中法选择基准数,并调整基准数到 left 位置 voidmedianOfThree(vector<int>& nums, int left, int right){ int mid = left + (right - left) / 2; if (nums[mid] > nums[right]) swap(nums[mid], nums[right]); if (nums[left] > nums[right]) swap(nums[left], nums[right]); if (nums[mid] > nums[left]) swap(nums[mid], nums[left]); // 此时,nums[left] 是中间值,将作为基准数 }
pair<int, int> partition(vector<int>& nums, int left, int right){ medianOfThree(nums, left, right); // 优化基准数选择 int pivot = nums[left]; int gt = left, lt = right + 1; int i = left + 1;
while (i < lt) { if (nums[i] > pivot) { swap(nums[i], nums[++gt]); i++; } elseif (nums[i] < pivot) { swap(nums[i], nums[--lt]); } else { i++; } } swap(nums[left], nums[gt]);