题目:输入n个整数,找出其中的最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4
思路:创建一个大小为k的大顶堆,每次从数组中读入一个数,与大顶堆的根作比较,如果小于根,将该数做根,然后调整大顶堆。依次比较,最后输出该大顶堆。
package com.flyoung; public class K { public static void heapAjust(int[] array,int s,int m){ //调整大顶堆 int temp ,j; temp=array[s]; for(j=2*s;j<=m;j*=2){ if(j<m&&array[j]<array[j+1]){//如果有左右结点,比较他们的大小 ++j; } if(temp>array[j]){ break; } array[s] = array[j]; // s = j; } array[s]=temp;//插入 } public static void GetLeastNumbers(int[] input,int n,int[] output,int k){ if(input==null||output==null||n<k||n<=0||k<=0){ return; } int i,j; for(i=0;i<k;i++){ //先将输入数组的k个数加入到输出数组 output[i+1]=input[i]; } for(j=k/2;j>0;j--){ //通过调整得到大顶堆 heapAjust(output,j,k); } for(i=k;i<n;i++){ if(input[i]<output[1]){ //与根比较 output[1]=input[i]; heapAjust(output,1,k); //调整根得到大顶堆 } } } public static void main(String[] args) { int k=4; int [] input = {4,5,1,6,2,7,3,8}; int [] output = new int[k+1]; //输出数组默认从小标1开始存放数据 GetLeastNumbers(input,input.length,output,k); for(int i=1;i<=k;i++){ System.out.println(output[i]); } } }