求数组最大k个数的问题(堆的应用)
1 无顺序的一个数组求最大的k个数
/************************************/
//寻找在数组中最大的K个数
//小顶堆插入
void constructHeap(int a[],int n,int value){a[n] = value;int j,temp = value;j = (n-1)/2;while (j>=0 && n!=0){if(a[j] <= temp)break;a[n] = a[j];n = j;j = (n-1)/2;}a[n] = temp;
}
//堆更新
void UpdataHeap(int a[],int index,int n)
{int j,temp = a[index];j = 2*index + 1;while (j < n){if(j+1 < n && a[j+1] < a[j])++j;if(a[j] >= temp)break;a[index] = a[j];index = j;j = index*2 +1;}a[index] = temp;
}
void MaxK(int a[],int n,int k){int i;int *temp = new int[k];for (i=0;i<n;++i){if(i < k)constructHeap(temp,i,a[i]);//先构造k堆else{if (temp[0] < a[i]){temp[0] = a[i];UpdataHeap(temp,0,k);//更新k堆;}}}for (i=0;i<k;++i){cout<<temp[i]<<" ";}delete []temp;
}
2 求N个降序数组的K个最大的数
1. 建立大顶堆,维度为数组的个数,这里为20(第一次 插入的是每个数组中最大的值,即第一个元素)。
2. 删除最大堆堆顶,保存到数组或者栈中,然后向最大堆插入删除的元素所在数组的下一个元素。
3. 重复第1,2个步骤,直到删除个数为最大的K个数,这里为500.
/************************************/
//N个降序数组,找到最大的K个数
//大顶堆
void constructHeap1(int a[],int n,int value){a[n] = value;int j,temp = value;j = (n-1)/2;while (j>=0 && n!=0){if(a[j] >= temp)break;a[n] = a[j];n = j;j = (n-1)/2;}a[n] = temp;
}
//堆更新
void UpdataHeap1(int a[],int index,int n)
{int j,temp = a[index];j = 2*index + 1;while (j < n){if(j+1 < n && a[j+1] > a[j])++j;if(a[j] <= temp)break;a[index] = a[j];index = j;j = index*2 +1;}a[index] = temp;
}
void GetMaxK(){const int rows = 20;const int cols = 500;const int K = 500;int data[rows][cols];int result[K];//前500int heap[20];//堆int i,j;for (i=0;i<rows;++i){for (j=0;j<cols;++j ){data[i][j] = rand();}}//快速排序for (i = 0;i<rows;++i){QuikSortDown(data[i],0,cols-1);}//开始for(j=0;j<cols;++j){for (i=0;i<rows;++i){if(0 == j)constructHeap1(heap,i,data[i][0]);//创建堆else{if((j-1)*rows + i >K-1 )break;result[(j-1)*rows + i] = heap[0];heap[0] = data[i][j];UpdataHeap1(heap,0,20);//更新堆}}}for (i=0;i<K;++i){cout<<result[i]<<" "<<endl;}
}
求数组最大k个数的问题(堆的应用)相关推荐
- 求数组中k个数的所有组合
/*** 求数组中 k个元素序列 的所有组合* @param start* @param array* @param length* @param k* @param list* @param use ...
- zoj 2112 树状数组 套主席树 动态求区间 第k个数
总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...
- C++实现求数组中前K大的数
参考:http://blog.csdn.net/xiaoding133/article/details/8037086 C++实现求数组中前K大的数,即求数组的最大的k个数 //数组中求最大的k个数 ...
- C++实现用堆求最小的k个数
参考:http://t.jobdu.com/thread-8094-1-1.html http://blog.chinaunix.net/uid-26548237-id-3513260.html ht ...
- 【剑指Offer】最小的k个数---大顶堆 Java
题目:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 求数组中最小(最大)的n个数通常可以使用大顶堆(小顶堆) ...
- [剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]
[问题描述]面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 : 输入:arr ...
- leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排
leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...
- 面试题 17.09. 第 k 个数[小顶堆][动态规划]
思路 暴力搜索 因为要求的数只含3\5\7这三个素因子,因此只需判断将每个数除3/5/7除尽后是否为1,从而判断是不是所要求序列中的一个数. 超时 代码如下: class Solution {publ ...
- 《剑指offer》NO40 最小的K个数 大顶堆实现 详解 <Java实现>
public class Solution2_大顶堆 {//用PriorityQueue 来实现一个大顶堆. 当队内元素个数大于K个并且新入的元素小于 大顶堆的最大值,那么就出队列,新的进入.所有元素 ...
最新文章
- linux C非阻塞延时,linux 非阻塞式socket编程求助。。
- [Groovy] Groovy API
- 拥抱开放计算标准 重构数据中心格局
- 【开机自启】属于你的个性化!八步完成喜欢的软件开机自启!
- SQL分类:DDL/DML/DQL/DCL以及作用
- 2022年全球及中国脂肪酸氯化物行业专项可行性与供需前景调研报告
- 爱拉托逊斯方法以及素数判断
- (四)maven之查找jar包坐标,选择jar包版本
- vue插槽面试题_关于前端Vue框架的面试题,面试官可能会问到哪些。?
- 【渝粤教育】国家开放大学2018年秋季 2238T个案工作 参考试题
- ubuntu mysql5.6_ubuntu安装mysql5.6
- python能做什么工作-python能做哪方面的工作
- python-微信自动发送信息
- hlw8032功率计测试软件,功率计量芯片LAYOUT指南
- javaweb_表单设计
- Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout)
- tomcat+nginx配置htpps
- 珠海实验室通风系统建设安装说明
- 一品制药创业板IPO过会:年营收3.82亿 拟募资5亿
- 19-10-15(msgbox、inputbox、注释)
热门文章
- c++ 数值转string。使用ostringstream流以及模板类
- Linux cp复制文件或文件夹
- linux lts版本的区别,什么是Linux 发行版的 LTS 版本?
- Perl 数组 操作符 pop,push,shift, unshift,splice
- lodash中get方法
- 概念驱动的教学在 IB 课程中的应用
- **MobaXterm基础操作**
- 【python】自动化连接和操作手机微信
- 鉴源论坛 · 观辙丨汽车CAN总线渗透测试
- 【Oboe——Android低延迟音频应用开发库使用介绍】