• 最小的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]);
            }
    
        }
    
    }
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
    分享到: 更多
  • 相关阅读:
    css实现多行文本溢出显示省略号(…)全攻略
    Git使用教程
    requireJS对文件合并与压缩(二)
    requireJS(版本是2.1.15)学习教程(一)
    谷歌浏览器javascript调试教程
    IPMITool driver
    ironic的自动化脚本
    serial console
    如何将自己写的代码上传到github上
    硬件检查
  • 原文地址:https://www.cnblogs.com/flyoung2008/p/2479745.html
Copyright © 2020-2023  润新知