package com.wangxiaohu;
public class FindKthLargest {
/**
* 数组中寻找第 K 大的元素
* 这个算法也叫做:快速选择算法
*
* @param nums
* @param k
* @return
*/
public int findKthLargest(int[] nums, int k) {
int lo = 0, hi = nums.length - 1;
k = nums.length - k;
while (lo <= hi) {
int p = partition(nums, lo, hi);
if (p < k) {
lo = p + 1;
} else if (p > k) {
hi = p - 1;
} else {
return nums[k];
}
}
return -1;
}
private int partition(int[] nums, int lo, int hi) {
if (lo == hi) {
return lo;
}
int i = lo, j = hi + 1;
int pivot = nums[lo];
while (true) {
while (nums[++i] < pivot) {
if (i == hi) {
break;
}
}
while (nums[--j] > pivot) {
if (j == lo) {
break;
}
}
if (i >= j) {
break;
}
swap(nums, i, j);
}
swap(nums, lo, j);
return j;
}
private void swap(int[] nums, int lo, int hi) {
int temp = nums[lo];
nums[lo] = nums[hi];
nums[hi] = temp;
}
}
【数组中寻找第 K 大元素】基于快速排序算法
最新推荐文章于 2024-11-17 18:23:42 发布