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     }

 

 

 

posted on 2014-03-19 03:40  longhorn  阅读(274)  评论(0编辑  收藏  举报

导航