熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

取前1w個數據不超過4秒

2022-06-13   來源: Java核心技術 
    package nettest;
   
    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;
   
    }
   
    }
   
    }
   
    }
   
    }
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25628.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.