topK问题快排解法

题目

输入整数数组,找到其中最小的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;
}
posted @ 2020-08-30 15:26  珂珂哒  阅读(399)  评论(0)    收藏  举报