美文网首页
求一亿个数字里面最小的10个数字

求一亿个数字里面最小的10个数字

作者: Matthew_Zhang | 来源:发表于2018-08-28 10:06 被阅读0次

    package com.yuzhiyun;import java.util.Arrays;/**

    * 求一亿个数里面最小的10个数

    * 首先建立节点个数为10的最大堆,然后考虑每一个新的值,让他和堆顶比较,比堆顶大的元素直接抛弃,如果比堆顶小的数字,让他替换堆顶,然后调整堆。

    */public classMaxTenNumber{    public static void main(String[] args) {

            /**第一个元素0不参与,只是用于占位置,这样的话,只要array[k]>array[2k] && array[k]>array[2k+1]那就是最大堆了,

            * 此外,这里暂时用20个数代替1亿个

            */        int[] array={0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,6,5};

            //建立建立节点个数为10的最大堆        for(int i=10/2;i>=1;i--){

                adjustHeap(array, i, 10);

            }

            //System.out.println(Arrays.toString(array));        for(int i=11;i

                //如果这个元素小于堆顶,和堆顶交换,然后重新调整堆            if(array[i]

                    swap(array, i, 1);

                    adjustHeap(array, 1, 10);

                }

            }

            System.out.println(Arrays.toString(array));

            System.out.println("最小的10个数字为:");

            for(int i=1;i<=10;i++){

                System.out.print(array[i]+" ");

            }

        }

        /**    * 交换    * @paramarray    * @parami    * @paramj    */    private static void swap(int[] array, int i, int j) {

            int tem=array[i];

            array[i]=array[j];

            array[j]=tem;

        }

        /**    * 在以array[head]为根的左右子树是最大堆的前提下把以array[head]为根的树调整为最大堆    * @paramarray    * @paramhead    * @paramtail    */    static void adjustHeap(int[] array,int head,int tail){

            int root=array[head];

            int i=2*head;

            while(i<=tail){

                int max=array[i];

                if(i+1<=tail)

                    if(array[i+1]>array[i]){

                        max=array[i+1];

                        i++;

                    }

                if(root>max)

                    //别手抖写成了return;                break;

                else{

                    array[i/2]=array[i];       

                }

                i*=2;

            }

            array[i/2]=root;

        }

    }

    相关文章

      网友评论

          本文标题:求一亿个数字里面最小的10个数字

          本文链接:https://www.haomeiwen.com/subject/ssjtcxtx.html