输入整数数组,找到其中最小的k个数
利用快排的每次选取锚点将其插入到合适的位置的特性,可以直接返回最小的k个数而不需要完整的排序
public int[] getLeastNumbers(int[] arr, int k) {
if(k==0||arr.length==0)return new int[0];
return quickSort(arr,0,arr.length-1,k-1);
}
private int[] quickSort(int[] arr,int l,int r,int target){
int j = post(arr,l,r);
if(j==target)return Arrays.copyOf(arr,j+1);
return j>target?quickSort(arr,l,j-1,target):quickSort(arr,j+1,r,target);//判断需要在哪一部分分割
}
private int post(int[] arr,int l,int r){//返回锚点最后插入的位置
int val = arr[l];
int i = l,j = r+1;
while(true){
while(++i<=r&&arr[i]<val);
while(--j>=l&&arr[j]>val);
if(i>=j)break;
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
arr[l] = arr[j];
arr[j] = val;
return j;
}
原文:https://www.cnblogs.com/keke-coding/p/13585361.html