1 无顺序的一个数组求最大的k个数

1)笨方法,先用快速排序对数组排序在找前k个;
2)  用堆,先建立k小顶堆,再扫描整个数组,堆顶为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个最大的数

http://www.cnblogs.com/ywl925/p/3794852.html

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个数的问题(堆的应用)相关推荐

  1. 求数组中k个数的所有组合

    /*** 求数组中 k个元素序列 的所有组合* @param start* @param array* @param length* @param k* @param list* @param use ...

  2. zoj 2112 树状数组 套主席树 动态求区间 第k个数

    总算是把动态求区间第k个数的算法看明白了. 在主席树的基础上,如果有修改操作,则要通过套树状数组来实现任意区间求第k小的问题. 刚开始看不明白什么意思,现在有一点理解.树状数组的每个元素是一个线段树, ...

  3. C++实现求数组中前K大的数

    参考:http://blog.csdn.net/xiaoding133/article/details/8037086 C++实现求数组中前K大的数,即求数组的最大的k个数 //数组中求最大的k个数 ...

  4. C++实现用堆求最小的k个数

    参考:http://t.jobdu.com/thread-8094-1-1.html http://blog.chinaunix.net/uid-26548237-id-3513260.html ht ...

  5. 【剑指Offer】最小的k个数---大顶堆 Java

    题目:输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 求数组中最小(最大)的n个数通常可以使用大顶堆(小顶堆) ...

  6. [剑指offer][JAVA][面试第40题][最小的k个数][快选][堆][BST]

    [问题描述]面试第40题 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 : 输入:arr ...

  7. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排

    leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...

  8. 面试题 17.09. 第 k 个数[小顶堆][动态规划]

    思路 暴力搜索 因为要求的数只含3\5\7这三个素因子,因此只需判断将每个数除3/5/7除尽后是否为1,从而判断是不是所要求序列中的一个数. 超时 代码如下: class Solution {publ ...

  9. 《剑指offer》NO40 最小的K个数 大顶堆实现 详解 <Java实现>

    public class Solution2_大顶堆 {//用PriorityQueue 来实现一个大顶堆. 当队内元素个数大于K个并且新入的元素小于 大顶堆的最大值,那么就出队列,新的进入.所有元素 ...

最新文章

  1. linux C非阻塞延时,linux 非阻塞式socket编程求助。。
  2. [Groovy] Groovy API
  3. 拥抱开放计算标准 重构数据中心格局
  4. 【开机自启】属于你的个性化!八步完成喜欢的软件开机自启!
  5. SQL分类:DDL/DML/DQL/DCL以及作用
  6. 2022年全球及中国脂肪酸氯化物行业专项可行性与供需前景调研报告
  7. 爱拉托逊斯方法以及素数判断
  8. (四)maven之查找jar包坐标,选择jar包版本
  9. vue插槽面试题_关于前端Vue框架的面试题,面试官可能会问到哪些。?
  10. 【渝粤教育】国家开放大学2018年秋季 2238T个案工作 参考试题
  11. ubuntu mysql5.6_ubuntu安装mysql5.6
  12. python能做什么工作-python能做哪方面的工作
  13. python-微信自动发送信息
  14. hlw8032功率计测试软件,功率计量芯片LAYOUT指南
  15. javaweb_表单设计
  16. Gradle‘s dependency cache may be corrupt (this sometimes occurs after a network connection timeout)
  17. tomcat+nginx配置htpps
  18. 珠海实验室通风系统建设安装说明
  19. 一品制药创业板IPO过会:年营收3.82亿 拟募资5亿
  20. 19-10-15(msgbox、inputbox、注释)

热门文章

  1. c++ 数值转string。使用ostringstream流以及模板类
  2. Linux cp复制文件或文件夹
  3. linux lts版本的区别,什么是Linux 发行版的 LTS 版本?
  4. Perl 数组 操作符 pop,push,shift, unshift,splice
  5. lodash中get方法
  6. 概念驱动的教学在 IB 课程中的应用
  7. **MobaXterm基础操作**
  8. 【python】自动化连接和操作手机微信
  9. 鉴源论坛 · 观辙丨汽车CAN总线渗透测试
  10. 【Oboe——Android低延迟音频应用开发库使用介绍】