package com.yuzhiyun;
import java.util.Arrays;
/**
* 求一亿个数里面最小的10个数
* 首先建立节点个数为10的最大堆,然后考虑每一个新的值,让他和堆顶比较,比堆顶大的元素直接抛弃,如果比堆顶小的数字,让他替换堆顶,然后调整堆。
*/
public class MaxTenNumber {
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};
for(int i=10/2;i>=1;i--){
adjustHeap(array, i, 10);
}
for(int i=11;i<array.length;i++){
if(array[i]<array[1]){
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]+" ");
}
}
/**
* 交换
* @param array
* @param i
* @param j
*/
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]为根的树调整为最大堆
* @param array
* @param head
* @param tail
*/
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)
break;
else{
array[i/2]=array[i];
}
i*=2;
}
array[i/2]=root;
}
}