• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
My Blog@github像少年啦飞驰
{关注大规模数据处理(MapReduce)J2EE等技术}
博客园    首页    新随笔    联系   管理    订阅  订阅
最小的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]);
        }

    }

}
作者:像少年啦飞驰
出处:http://www.cnblogs.com/flyoung2008/
Blog:http://www.flyoung.me
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
分享到: 更多
posted on 2012-05-02 22:21  像少年啦飞驰  阅读(521)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3