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
- Java堆排序,取得前TopN个数
- 【java】堆排序 最小的k个数
- Spark Java 分组排序取TopN
- 从N个数中选取最大的前10个[堆排序版]
- 从N个数中选取最大的前10个[堆排序版]
- TopN排序和TopN 数组排序
- Day20 实现TopN 排序
- n个数的排序--堆排序
- java排序 -- 堆排序
- 堆排序(最小的K个数)
- 最小的K个数,堆排序——剑指offor Java程序
- Spark Scala TopN分组排序
- 利用堆求最大或最小的前k个数
- Java堆排序算法
- 堆排序(java)
- Java 堆排序算法
- JAVA 堆排序
- 堆排序Java代码
- FL2440移植u-boot
- 进程与线程的理解
- hadoop 2.2.0集群安装(CentOS)
- FL2440修改为Linux单系统
- 西方对俄制裁力度稍弱 白银小幅回落
- Java堆排序,取得前TopN个数
- Algorithm学习笔记 --- Piggy-Bank(动态规划)
- .bat文件的for语句使用方法
- colinux下找不到mysql.h的历程
- Js中的string.format(),string.substring(start,end),string.substr(start,length)
- open和fopen的区别
- java swing 飞机 空战 全屏 复制 粘贴 可运行
- leetcode Best Time to Buy and Sell Stock
- mdrill