最小的k个数

题目:输入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]);
        }

    }

}
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
分享到: 更多
原文地址:https://www.cnblogs.com/flyoung2008/p/2479745.html