package net
test;
import javautilArrays;
import javautilDate;
import javautilRandom;
public class Top {
public static void main(String[] args) {
find()
}
public static void find( ) {//
int number = ;// 一亿个数
int maxnum = ;// 随机数最大值
int i = ;
int topnum = ;// 取最大的多少个
Date startTime = new Date()
Random random = new Random()
int[] top = new int[topnum];
for (i = ; i < topnum; i++) {
top[i] = Mathabs(randomnextInt(maxnum))//设置为随机数
// top[i] = getNum(i)
}
buildHeap(top toplength)// 构建最小堆 top[]为最小元素
for (i = topnum; i < number; i++) {
int currentNumber = Mathabs(randomnextInt(maxnum))//设置为随机数
// int currentNumber = getNum(i)
// 大于 top[]则交换currentNumber 重构最小堆
if (top[] < currentNumber) {
top[] = currentNumber;
shift(top toplength ) // 构建最小堆 top[]为最小元素
}
}
Systemoutprintln(ArraystoString(top))
sort(top)
Systemoutprintln(ArraystoString(top))
Date endTime = new Date()
Systemoutprintln(用了+(endTimegetTime() startTimegetTime())+毫秒)
}
public static int getNum(int i){
return i;
}
//构造排序数组
public static void buildHeap(int[] array int from int len) {
int pos = (len ) / ;
for (int i = pos; i >= ; i) {
shift(array from len i)
}
}
/**
* @param array top数组
* @param from 开始
* @param len 数组长度
* @param pos 当前节点index
* */
public static void shift(int[] array int from int len int pos) {
// 保存该节点的值
int tmp = array[from + pos];
int index = pos * + ;// 得到当前pos节点的左节点
while (index < len)// 存在左节点
{
if (index + < len
&& array[from + index] > array[from + index + ])// 如果存在右节点
{
// 如果右边节点比左边节点小就和右边的比较
index += ;
}
if (tmp > array[from + index]) {
array[from + pos] = array[from + index];
pos = index;
index = pos * + ;
} else {
break;
}
}
// 最终全部置换完毕后 把临时变量赋给最后的节点
array[from + pos] = tmp;
}
public static void sort(int[] array){
for(int i = ; i < arraylength ; i++){
//当前值当作最小值
int min = array[i];
for(int j = i+; j < arraylength; j++){
if(min>array[j]){
//如果后面有比min值还小的就交换
min = array[j];
array[j] = array[i];
array[i] = min;
}
}
}
}
}