Java堆排序,取得前TopN个数

来源:互联网 发布:网络玄幻小说 编辑:程序博客网 时间:2024/05/16 10:38
import java.util.Random;/** * Created with IntelliJ IDEA. * User: pengfei.hpf * Date: 14-4-29 * Time: 上午11:45 * To change this template use File | Settings | File Templates. */public class HeapSortUtil {    /**     * 用堆排序方法  找出前N个最大的数     * @originalArray 原始数据数组     * @topN 需要取得的N个最大数     * @return  包含topN个最大数的数组     */    public int[] getTopArray(int[] originalArray,int topN){        int len = originalArray.length ;        if(len <= topN){            return  originalArray;        }        int[] array = new int [topN];        initHeap(originalArray);        int temp;        for(int i=0;i<array.length;i++){            array[i]= originalArray[0];            temp=originalArray[originalArray.length-i-1];            originalArray[originalArray.length-i-1]=originalArray[0];            originalArray[0]=temp;            buildHeap(0,originalArray.length-i-1,originalArray);        }        return array;    }    /**     * 创建初始无序堆     */    private void initHeap(int[] orignalArr){        for(int i=orignalArr.length-1;i>=0;i--){            buildHeap(i,orignalArr.length,orignalArr);        }    }    /**     * 调整堆     * @param location 起始位置     * @param unSortLength 无序堆的长度     */    private void buildHeap(int location,int unSortLength,int[] arr){        int temp;        int tempLoc;        //判断该父节点是否有左右孩子        if((tempLoc = (location+1)*2)<unSortLength){            if(arr[tempLoc]>arr[tempLoc-1]){//如果右节点大于左节点                if(arr[tempLoc]>arr[location]){//如果右节点大于父节点  就双方交换值                    temp = arr[location];                    arr[location] = arr[tempLoc];                    arr[tempLoc] = temp;                    buildHeap(tempLoc,unSortLength,arr);//递归                }            }else{//如果左节点大于右节点                if(arr[tempLoc-1]>arr[location]){//如果左节点大于父节点                    temp = arr[location];                    arr[location] = arr[tempLoc-1];                    arr[tempLoc-1] = temp;                    buildHeap(tempLoc-1,unSortLength,arr);//递归                }            }        }else if((tempLoc =((location+1)*2-1))<unSortLength){//如果该父节点有左节点            if(arr[tempLoc]>arr[location]){//如果右节点大于父节点                temp = arr[location];                arr[location] = arr[tempLoc];                arr[tempLoc] = temp;                buildHeap(tempLoc,unSortLength,arr);//递归            }        }    }    public static void main(String[] args) {        int[] arr =new int[100000];        Random ran = new Random();        for (int i = 0; i < arr.length; i++) {            arr[i] = ran.nextInt(100000);        }        HeapSortUtil h  = new HeapSortUtil();        long start =  System.currentTimeMillis();        int topArr[] = h.getTopArray(arr, 20);        //打印出排序后的数组        for(int i=0;i<topArr.length;i++){            System.out.println(topArr[i]);        }        long end = System.currentTimeMillis()-start;        System.out.println("Total time:" + end + "ms");    }}

0 1
原创粉丝点击