class Solution {
public int findKthLargest(int[] nums, int k) {
quickSort(nums, 0, nums.length - 1, k);
return nums[nums.length - k];
}
public void quickSort(int[] nums, int left, int right, int k) {
if (left < right) {
int pviotPosition = partition(nums, left, right);
// 快排提前终止
if (pviotPosition == nums.length - k) {
return;
}
// 快排分区优化
if (pviotPosition > nums.length - k) {
quickSort(nums, left, pviotPosition - 1, k);
} else {
quickSort(nums, pviotPosition + 1, right, k);
}
}
}
/**
分区函数是为了找到枢纽元素在数组中的最终位置,也是快排的核心算法
*/
public int partition(int[] nums, int left, int right) {
swap(nums, left, (left + right) / 2);
int pviotNum = nums[left];
while (left < right) {
while (left < right && nums[right] >= pviotNum) {
right--;
}
nums[left] = nums[right];
while (left < right && nums[left] <= pviotNum) {
left++;
}
nums[right] = nums[left];
}
nums[left] = pviotNum;
return left;
}
public void swap(int[] nums, int a, int b) {
if (nums[a] != nums[b]) {
int temp = nums[a];
nums[a] = nums[b];
nums[b]= temp;
}
}
}
LeetCode215_数组中的第K个最大元素_排序_快速排序_经典快排代码好理解版
于 2022-08-20 16:50:23 首次发布