【算法】使用大根堆,解决top_k问题

来源:互联网 发布:研究生论文数据造假 编辑:程序博客网 时间:2024/05/24 22:45


题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。



 public static ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {        ArrayList<Integer> list=new ArrayList<Integer>();        if(input==null || input.length<k||input.length<=0  ){            return list;        }        for(int len=(input.length-1)/2; len>=0; len--){            adjustBigHeap(input,len,input.length-1);//初始化建大根堆        }               int tmp;        for(int i=input.length-1; i>0; i--){            //第一个元素交换到最后,重新调整为大根堆                tmp=input[0];                input[0]=input[i];                input[i]=tmp;                adjustBigHeap(input,0,i-1);                    }        for(int j=0; j<k; j++){            list.add(input[j]);        }        return list;    }   public static void adjustBigHeap(int[] input, int begin, int length){         int temp;         int child;         for(temp=input[begin]; 2*begin+1<=length; begin=child){//从begin元素向下查找             child=2*begin+1;             if(child<length && input[child]<input[child+1]){//找到孩子中大的                 child++;             }             if(input[child]>temp){                 input[begin]=input[child];             }else{                 break;             }         }         input[begin]=temp; }  public static void main(String[] args) {  int arr[]={2,3,5,6,1,4,7,8,9};  ArrayList<Integer>a= GetLeastNumbers_Solution(arr,4);  System.out.println(a);  }