此题和算法导论9-1题很像,但是前k个大数不要求有序,所以可以省点事。利用快速排序的思想和修改算法导论9.2节线性时间选择元素的RANDOMIZED-SELECT(),算法期望时间复杂度 O(n).
public static int selectIndex(int[] array, int begin, int end, int kMax) {
if( begin == end) {
return begin;
}
int pivotIndex = partition(array, begin, end);
int maxNb = pivotIndex - begin + 1;
if(kMax == maxNb) {
return pivotIndex;
}
else if( maxNb < kMax) {
return selectIndex(array, pivotIndex+1, end, kMax-maxNb);
}
else {
return selectIndex(array, begin, pivotIndex-1, kMax);
}
}
public static void main(String[] args) {
int[] array = {3, 2, 9, 0, 7, 5, 4, 8, 6, 1 };
int[] array1 = { 2, 8, 7, 1, 3, 5, 6, 4, 9};
int[] array2 = { 13, 19, 9, 5, 12, 8, 7, 4, -1, 2, 6, 11 };
selectMaxNumber(array, 8);
selectMaxNumber(array1, 7);
selectMaxNumber(array2, 10);
}
static int partition(int[] array, int start, int end) {
int pivotValue = array[end];
int i = start - 1;
for (int q = start; q < end; q++) {
if (array[q] > pivotValue) {
i = i + 1;
exchange(array, i, q);
}
}
exchange(array, i + 1, end);
return i + 1;
}
private static void exchange(int[] array, int i, int q) {
int temp = array[i];
array[i] = array[q];
array[q] = temp;
}
public static void selectMaxNumber(int[] array, int kMax) {
int pivotIndex = selectIndex(array, 0, array.length-1, kMax);
System.out.println("The "+ kMax + " numbers are:");
for(int i=0; i<= pivotIndex; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}