package org.example.test; /** * 采用快速排序,每次以当前表中第一个元素为轴来对表进行划分,将表中比枢轴大的元素向左移, * 比表中小的元素向右移,使得下一趟partition操作后,表中的元素备枢轴一份为二。 * 每次partition可以确定一个第N(N=low+1)大元素,如果N==K,则是第K大元素。 */ public class TopKTest { public static void main(String[] args) { int[] nums = {1332802,1177178,1514891,871248,753214,123866,1615405,328656,1540395,968891,1884022,252932,1034406,1455178,821713,486232,860175,1896237,852300,566715,1285209,1845742,883142,259266,520911,1844960,218188,1528217,332380,261485,1111670,16920,1249664,1199799,1959818,1546744,1904944,51047,1176397,190970,48715,349690,673887,1648782,1010556,1165786,937247,986578,798663}; System.out.println(findKth(nums, 49, 24)); } public static int findKth(int[] a, int n, int K) { // write code here quickSort(a, 0, n - 1, K); return a[K-1]; } public static void quickSort(int[] a, int low, int high, int k) { if (low >= high) { return; } int p = partition(a, low, high); if (p + 1 == k) { return; } if(p+1>k) { quickSort(a, low, p - 1, k); } else { quickSort(a, p + 1, high, k); } } private static int partition(int[] a, int low, int high) { int tmp = a[low]; while (low < high) { while (low < high && a[high] <= tmp) { --high; } a[low] = a[high]; while (low < high && a[low] >= tmp) { ++low; } a[high] = a[low]; } a[low] = tmp; return low; }