bfprt算法----找出数组中最小的k个数(Java)



无序数组中最小的k个数

对于一个无序数组,数组中元素为互不相同的整数,请返回其中最小的k个数。

给定一个整数数组A及它的大小n,同时给定k,请返回其中最小的k个数。

测试样例:
[1,2,4,3],4,2
返回:[1,2]

(1)利用堆,时间复杂度O(Nlogk)

public class Main {
 public static void main(String[] args) {
  Main test = new Main();
  int[] a={3188,4522,2526,4085,1621,723,1073};
  int[] b=new int[6];
     b=test.findKthNumbers(a,7,6);
     System.out.println(b[0]);
     System.out.println(b[1]);
     System.out.println(b[2]);
     System.out.println(b[3]);
     System.out.println(b[4]);
     System.out.println(b[5]);
 }
 public int[] findKthNumbers(int[] A, int n, int k) {
        if(A==null||n<=k||k<1){
            return A;
        }
        int[] result=new int[k];
        heapSort(A,result,k);
        for(int i=k;i<n;i++){
            if(A[i]<result[0]){
                heapModify(result,A[i]);
            }
        }
        return result;
    }
    public void heapSort(int[] arr,int[] result,int k){
        result[0]=arr[0];
        for(int i=0;i<k;i++){
            result[i]=arr[i];
            int index=i;
            int parent=(i-1)/2;
            while(parent>=0&&result[parent]<result[index]){
                swap(result,parent,index);
                index=parent;
                parent=(parent-1)/2;
            }
        }
    }
    public void heapModify(int[] arr,int key){
        arr[0]=key;
        int k=arr.length;
        int index=0;
        int child=(index+1)*2-1;
        if(child+1<k){
            child=arr[child]>=arr[child+1]?child:child+1;
        } 
        while(child<k&&arr[index]<arr[child]){
            swap(arr,index,child);
            index=child;
            child=(child+1)*2-1;
         if(child+1<k){
          child=arr[child]>=arr[child+1]?child:child+1;
         }
        }
    }
    public void swap(int[] arr,int i,int j){
        int temp;
        temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
}

(2) 利用快排  平均O(n) 最坏O(n^2)

public class Main {
  public static void main(String[] args) {
   Main test = new Main();
     int[] a={3188,4522,2526,4085,1621,723,1073};
     int[] b=new int[6];
        b=test.findKthNu

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值