考察点
数组的排序
知识点
题目
分析
题目要求一个序列中最小的k个数,最简单的方法就是对整个数组进行排序,找到最小的k个,而排序算法最快也需要o(nlogn)。我们要求最小的k个数,其实可以等价替换为求坐标为k-1的元素,且该元素前面的元素都比它小(这部分元素可以是无序的),后面的都比它大,其实就可以了。考虑到快排中有一个partion算法,能够很好的解决这个问题,整个时间复杂度为O(n)
public class Thirty {
public static void main(String[] args) {
int[] arr = {4,5,1,6,2,7,3,8};
findMinK(arr,4);
for (int i = 0;i<4;i++) {
System.out.println(arr[i]);
}
}
static void findMinK(int[] arr,int k) {
int start = 0;
int end = arr.length - 1;
while(index != k - 1) {
int index = partion(arr,start,end);
if (index < k - 1) {
start = index + 1;
} else if (index > k - 1) {
end = index - 1;
}
}
}
static int partion(int[] arr,int start,int end) {
int privot = arr[end];
int index = start - 1;
for (int i = start;i<arr.length;i++) {
if (arr[i] < privot) {
index++;
int tmp = arr[i];
arr[i] = arr[index];
arr[index] = tmp;
}
}
arr[end] = arr[index+1];
arr[index+1] = privot;
return index + 1;
}
}