思路:总体类似二分查找,部分类似快排。将小于当前元素的数,都放到元素左侧。返回位置,当位置大于K-1时,在左侧找;反之在右侧找。找到第K-1个位置的数后,输出前k个即可。
public class Test3 {
public static void main(String[] args) {
int[] arr = {3, 4, 6, 5, 3, 2, 1};
int k = 3;
findKData(arr, k);
}
public static void findKData(int[] arr, int k) {
int start = 0;
int end = arr.length - 1;
int index = partition(arr, start, end);
while (k - 1 != index) {
if (k - 1 < index) {
end = index - 1;
index = partition(arr, start, end);
} else if (k - 1 > index) {
start = index + 1;
index = partition(arr, start, end);
}
}
for (int i = 0; i < k; i++) {
System.out.print(arr[i] + " ");
}
}
public static int partition(int[] arr, int start, int end) {
int priov = arr[end];
int i = start;
for (int j = start; j < end; ++j) {
if (arr[j] < priov) {
swap(arr, i, j);
i++;
}
}
swap(arr, i, end);
return i;
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}