Find the Kth largest Element in the Array
http://www.geeksforgeeks.org/k-largestor-smallest-elements-in-an-array/
可以用冒泡排序。外循环k次,不用n次。O(nk)。
我想用quick sort的partition。每一次选择一个pivot,然后确定它的index。如果它的位置大于k,那么就在[left, index-1]找;如果它的位置小于k,那么就在[index+1, right]找。直到找到k。
这里不能用和quick sort完全一样的partition,因为那个partition不会返回pivot的index。
这里的做法是,先把pivot放到数组的末尾。然后对[left, right]按照pivot排序。最后跳出循环时,i一定对应一个大于等于pivot的值。这个时候再把pivot与A[i]交换,就能得到pivot的正确位置。
1 public static int findkth(int[] A, int k) { 2 int left = 0, right = A.length-1; 3 while (true) { 4 int index = partition(A, left, right); 5 if (index == A.length - k) return A[index]; 6 else if (index > A.length - k) right = index - 1; 7 else left = index + 1; 8 } 9 } 10 11 public static int partition(int[] A, int left, int right) { 12 int i = left, j = right-1; 13 int pivot = A[(left + right)/2]; 14 15 swap(A, (left + right) / 2, right); 16 17 while (i <= j) { 18 while (i < A.length && A[i] < pivot) { 19 i++; 20 } 21 while (j >= 0 && A[j] > pivot) { 22 j--; 23 } 24 if (i <= j) { 25 swap(A, i, j); 26 i++; 27 j--; 28 } 29 } 30 31 swap(A, i, right); 32 33 return i; 34 } 35 36 public static void swap (int[] A, int i, int j) { 37 int tmp = A[i]; 38 A[i] = A[j]; 39 A[j] = tmp; 40 }