public static void firstKMaxValue(int[] array, int start, int end, int k) {
if (start > end || k >= array.length) { // 限制条件
return;
}
// 索引为start的值作为分区值
int div = array[start];
int j = start; // 作为分区值得索引
// 以下循环将数组分为两部分,左边部分小于分区值,右边部分大于等于分区值
for (int i = start + 1; i <= end; i++) {
if (array[i] < div) {
j++;
if (j != i) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
}
array[start] = array[j];
array[j] = div;
// 此时分区值处于它在数组中对应的位置上,如分区值是数组中的第2个元素,那么j就应该等于1。
// 如果j<k,就以array[j+1]作为分区值,重新划分右部分数组
// 如果j>k,就以array[start]作为分区值,重新划分左部分数组。
// (注意这里的array[start]与原始数组的array[start]的值可能是不同的。)
// 如果j=k,就计算出了数组中第K(k>=0)个最大数的值。
if (j < k) {
firstKMaxValue(array, j+1, end, k);
} else if (j > k) {
firstKMaxValue(array, start, j-1, k);
} else {
System.out.println("第"+k+"个最小值:"+array[j]);
}
}
转载于:https://my.oschina.net/wxcchd/blog/268328