python堆排序求topn_堆排序和topN算法
堆排序和topN算法:
topN算法,第一次调用topN,然后把海量数据一次和小顶堆第一个比较,如果>第一个元素,就交换,然后调用minHeapify方法排序一遍。
然后比较下一个数据。
public class HeapSortAndTopN {
public static void main(String[] args) {
int[] arr = new int[]{3,5,3,0,8,6,1,5,8,6,2,4,9,4,7,0,1,8,9,7,3,1,2,5,9,7,4,0,2,6};
new HeapSortAndTopN().sort(arr);
System.out.println(Arrays.toString(arr));
}
public void sort(int[] a) {
int len = a.length;
int firstNonLeafIndex = (len - 2)/2;
for(int i = firstNonLeafIndex; i >=0 ; i --) {
maxHeapify(a,len,i);
}
for(int j = len - 1; j > 0 ; j --) {
swap(a,j,0);
maxHeapify(a,j,0);
}
}
private void maxHeapify(int[] a, int len, int subTreeNodeMax) {
int left = subTreeNodeMax * 2 + 1;
int right = subTreeNodeMax * 2 + 2;
int maxIndex = subTreeNodeMax;
if(left < len && a[left] > a[maxIndex]) {
maxIndex = left;
}
if(right < len && a[right] > a[maxIndex]) {
maxIndex = right;
}
if(maxIndex != subTreeNodeMax) {
swap(a, maxIndex, subTreeNodeMax);
maxHeapify(a, len, maxIndex);
}
}
private void minHeapify(int[] a, int len, int subTreeNodeMax) {
int left = subTreeNodeMax * 2 + 1;
int right = subTreeNodeMax * 2 + 2;
int maxIndex = subTreeNodeMax;
if(left < len && a[left] < a[maxIndex]) {
maxIndex = left;
}
if(right < len && a[right] < a[maxIndex]) {
maxIndex = right;
}
if(maxIndex != subTreeNodeMax) {
swap(a, maxIndex, subTreeNodeMax);
maxHeapify(a, len, maxIndex);
}
}
private void swap(int[] a, int i, int j) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
public int[] topN(int[] array) {
if(array != null && array.length > 0) {
int arrayLen = array.length;
int firtNonLeafIndex = (arrayLen - 2) / 2;
for(int i = firtNonLeafIndex; i >= 0 ; i --) {
minHeapify(array, arrayLen, i);
}
}
return array;
}
}
python堆排序求topn_堆排序和topN算法相关推荐
- python堆排序求topn_Java堆排序,取得前TopN个数
import java.util.Random; /** * Created with IntelliJ IDEA. * User: pengfei.hpf * Date: 14-4-29 * Tim ...
- Python入门篇-数据结构堆排序Heap Sort
Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树每个非叶子结点都要大于或者等于其左右孩子结点的 ...
- 堆排序时间复杂度_堆排序算法
堆排序是指利用堆积树这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大.将待排序的数组建堆,然后不断 ...
- python:实现求模逆算法(附完整源码)
python:实现求模逆算法 def gcd(a: int, b: int) -> int:while a != 0:a, b = b % a, a
- Python实现相空间重构求关联维数——GP算法、自相关法求时间延迟tau、最近邻算法求嵌入维数m
Python实现相空间重构求关联维数--GP算法.自相关法求时间延迟tau.最近邻算法求嵌入维数m GP算法: 若有一维时间序列为{x1,x2,-,xn},对其进行相空间重构得到高维相空间的一系列向量 ...
- python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...
本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² ...
- 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较
掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间.每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中 ...
- 堆排序稳定性举例_常见排序算法的稳定性分析
一.不稳定排序算法有哪些 1.堆排序 2.希尔排序 3.快速排序 4.选择排序 口诀:一堆(堆)希尔(希尔)快(快速)选(选择) 二.常见排序算法稳定性分析 1.堆排序稳定性分析 我们知道堆的结构是节 ...
- python求一元二次方程实根_Python编程实现数学运算求一元二次方程的实根算法示例...
本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a,b,c),接收3个参数,返回一元二次方程:ax² + ...
最新文章
- leetcode解题文件夹
- AI如何在安防行业更加深入?可从超高清视频监控切入
- 都是CPU松动若的祸
- 又一金融科技巨头入局,智慧出行的竞争靠什么胜出?
- wxWidgets:wxBusyInfo类用法
- asp dsn mysql 连接失败_ASP连接MySQL遇到一些问题 Microsoft OLE DB Provider for ODBC Drivers (0x80004005)...
- centos samba 配置
- 70%以上程序员,不懂数据结构和算法!
- spark 如何用netty实现akka的actor模型
- 酷炫的深色模式APP设计模板|2020设计潮流趋势
- 【Android】3.24 示例24--OpenGL绘制功能
- 【SICP练习】115 练习3.41
- 文华财经数据导出工具
- android tf卡检测工具,检测SD卡真假!安卓App一键识破SD卡真伪
- python-视频爬取到本地
- cuda-gdb 调试 Program terminated with signal SIGKILL, Killed. The program no longer exists.
- QCM2290 充电指示灯 —— CHG_LED_SINK
- 12.2 数据库控制文件复制到ASM磁盘组
- 嵌入式开发:当用微控制器构建嵌入式GUI时,有哪些注意事项
- AES数据加密|解密 ECB_Pkcs7_128