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[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)

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))

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

System.out.println(topArr[i]);

}

long end = System.currentTimeMillis()-start;

System.out.println("Total time:" + end + "ms");

}

}

python堆排序求topn_Java堆排序,取得前TopN个数相关推荐

  1. c语言求数列的和_例15:C语言求Fibonacci数列的前30个数

    例15:求Fibonacci数列的前30个数.这个数列有以下特点:第1,2两个数为1,1,.从第三个数开始,该数是其前两个数之和.(斐波那契不死神兔) 解题思路:从前两个月的兔子数可以推出第3个月的兔 ...

  2. c语言求fibonacci数列前20,求fibonacci数列的前20个数之和

    使用数组求Fibonacci数列的前20项.要求4项一行输出. 斐波那契数列通项公式:斐波那契数列指的是这样一个数列:1.1.2.3.5.8.13.21.--这个数列从第三项开始,每一项都等于前两项之 ...

  3. python堆排序求topn_堆排序和topN算法

    堆排序和topN算法: topN算法,第一次调用topN,然后把海量数据一次和小顶堆第一个比较,如果>第一个元素,就交换,然后调用minHeapify方法排序一遍. 然后比较下一个数据. pub ...

  4. [leetcode]堆排序 求前k大的数

    前一篇博客中写到了排序算法,其中包含一个堆排序,因此本篇博客讲解堆这个数据结构及其应用. 关于最大堆最小堆以及初始建堆和整理堆在上篇博客中有提及,此处不再赘述.下面讲解一个堆的重要应用,求n个数中前k ...

  5. Python入门篇-数据结构堆排序Heap Sort

    Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树每个非叶子结点都要大于或者等于其左右孩子结点的 ...

  6. python列表求斐波那契数列_python3 求斐波那契数列(Fibonacci sequence)

    输出斐波那契数列的前多少个数. 利用函数 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan # ----斐波那契数列( ...

  7. ACM_求N^N的前5位数和后5位数(数论)

    NNNNN Time Limit: 2000/1000ms (Java/Others) Problem Description: 对于整数N,求N^N的前5位和后5位(1057题加强版) Input: ...

  8. python函数编程求三个数的最小公倍数_Python求三个数的最小公倍数

    题目 求三个数的最小公倍数 思路 首先求两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数就是最终结果 有两种方案求两个数的最小公倍数 1. 分解质因数,也是短除法(在程序上差别不大) 循环 ...

  9. python练习题(python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数” 等)

    实验环境:python2.7 题目1:python之"求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数" 程序: import math def factorial(n): ...

最新文章

  1. 赠票 | 中国数据智能管理峰会(上海)
  2. IP-Address TextBox
  3. cacti命令行添加监控详解
  4. 2月份.xyz域名总量10强:西数称王 注册量破百万
  5. 译文 | 与TensorFlow的第一次接触 第六章:并发
  6. java byte 图片浏览器直接显示_在imge控件中直接显示图片(图片是byte[]格式)
  7. B - Sort the Array
  8. Matlab Gramm绘图工具箱
  9. 传统模式下安装linux,在将引导顺序更改为传统模式或在传统模式下安装操作系统时找不到引导设备...
  10. CSC公派访问学者申请条件是什么?
  11. pycharm 将本地文件添加到library root
  12. 接上一篇Trao文本行数及省略号问题
  13. 数据库课设--基于Python+MySQL的餐厅点餐系统
  14. 国外数据平台统计分析sdk
  15. Android Zxing3.3.2扫描、生成、解析二维码,以及近距离无法识别的问题
  16. 蓝桥杯 ALGO-1005 数字游戏
  17. CA认证及http实现方法
  18. VLAN的划分以及三层交换机理论,OMG,太详细了吧,看它!
  19. Android桌面控件Widget解析
  20. BSP -- 图书共享系统(Book Sharing Platform)

热门文章

  1. 2007年10月小记
  2. 数据结构实验之图论四:迷宫探索_用图机器学习探索 A 股个股相关性变化
  3. 配置库用户_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境
  4. python pprint_【Python】输入和输出
  5. java经常会出现异常的是,“Java异常Exception”总结
  6. android系统设置在哪里,android-如何在系统settings里添加设置选项
  7. 使用python 下载_使用python下载大量文件
  8. Weights and Measures(贪心+动态规划)
  9. python 获取json中最大值_详细解析 Python 爬取 bilibili 的视频、弹幕以及封面
  10. 布隆过滤器 redis_redis布隆过滤器