首页 > 其他 > 详细

topK问题快排解法

时间:2020-08-30 16:14:35      阅读:60      评论:0      收藏:0      [点我收藏+]

题目

输入整数数组,找到其中最小的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;
}

topK问题快排解法

原文:https://www.cnblogs.com/keke-coding/p/13585361.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!