题目
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例
最佳代码
在写之前务必复习下快排
package com.vleus.algorithm.sort;
import java.util.Arrays;
/**
* @author vleus
* @date 2021年07月26日 22:04
*/
public class CustomQuickSort {
public static void quickSort(int[] array) {
int len = array.length;
if (array == null || len == 0) {
return;
}
quickSort2(array,0,array.length-1);
}
public static void quickSort2(int[] arr, int left, int right) {
if (left > right) {
return;
}
int base = arr[left];
int i = left;
int j = right;
while (i != j) {
//从j开始遍历,从右到左找比j小的数
while (arr[j] >= base && i < j) {
j--;
}
while (arr[i] <= base && i < j) {
i++;
}
if (i < j) {
swap(arr,i,j);
}
}
arr[left] = arr[i];
arr[i] = base;
quickSort2(arr, left, i - 1);
quickSort2(arr, i + 1, right);
}
public static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void main(String[] args) {
int[] nums = {3, 45, 78, 36, 52, 11, 39, 36, 52};
quickSort(nums);
System.out.println(Arrays.toString(nums));
}
}
第K大的代码
package com.vleus.algorithm.sort;
import java.util.Arrays;
import java.util.Random;
/**
* @author vleus
* @date 2021年05月23日 22:14
*/
public class KthLargestElement {
//方法一:直接排序
public int findKthLargest1(int[] nums, int k) {
Arrays.sort(nums);
return nums[nums.length - k];
}
//方法二:基于快排的选择
public static int findKthLargest(int[] nums, int k) {
//利用快速排序
return quickSelect(nums, 0, nums.length - 1, nums.length - k);
}
public static int quickSelect(int[] nums, int start, int end, int index) {
//找到基准位置返回即可
int position = randomPosition(nums, start, end);
//判断当前pivot是否为index
if (position == index) {
return nums[position];
} else {
return position > index ? quickSelect(nums, start, position - 1, index) : quickSelect(nums, position + 1, end, index);
}
}
//实现随机分区方法
public static int randomPosition(int[] nums, int start, int end) {
Random random = new Random();
int randIndex = start + random.nextInt(end - start + 1);
int i = start;
int j = end;
int temp = nums[start];
while (i < j) {
while (i < j && temp <= nums[j]) {
j--;
}
while (i < j && temp >= nums[i]) {
i++;
}
if (i < j) {
swap(nums,i,j);
}
}
nums[start] = nums[i];
nums[j] = temp;
return j;
}
public static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
public static void main(String[] args) {
int nums[] = {3, 45, 78, 36, 52, 11, 39, 36, 52};
System.out.println(findKthLargest(nums, 1));
System.out.println(findKthLargest(nums, 2));
System.out.println(findKthLargest(nums, 3));
System.out.println(findKthLargest(nums, 4));
System.out.println(findKthLargest(nums, 5));
System.out.println(findKthLargest(nums, 6));
System.out.println(findKthLargest(nums, 7));
System.out.println(findKthLargest(nums, 8));
System.out.println(findKthLargest(nums, 9));
}
}