【算法】寻找K个最大的数组
来源:互联网 发布:海康网络解码器 编辑:程序博客网 时间:2024/05/16 03:33
1.问题描述:
有一堆未排序的数,前选择其中最大的K个进行输出。
2.问题解析:
快速排序:O(nlogn)
堆排序:O(nlogn)
但是老师说一般面试的答案是堆排,我也估计会快一些。
3.问题流程:
堆,是指根节点大于(或小于)其子节点的完全二叉树;最优二叉树是指左子树<根节点<右节点的二叉树。
先构建一个大根堆,然后取出堆顶元素,将堆顶和堆尾元素互换,维护大根堆。
建堆的过程是从数组一半,到最开始,每次刷堆。
刷堆的过程是,记录下待刷元素,然后于其子节点中比较大的那个进行比较,如果子节点大,则互换,并移动父子指针,直到最后。
4.代码:
void heapSort(int unSort[],int n,int i) {int x=unSort[i];int j=2*i+1; while(j<=n-1){//×¢ÒâÔ½½çÅжÏif ((j<n-1)&&(unSort[j]<unSort[j+1])) j=j+1;if (unSort[j]>x){unSort[i]=unSort[j];i=j;j=2*i+1;}elsej=n;}unSort[i]=x;}int * SelectKNumber(int unSort[],int k,int length){ int i;int *Sort;Sort=new int[k]; for (i=length/2;i>=0;i--){heapSort(unSort,length,i);}for (i=0;i<k;i++){Sort[i]=unSort[0];unSort[0]=unSort[length-i-1];unSort[length-i-1]=Sort[i];heapSort(unSort,length-i-2,0);}return Sort;}
- 【算法】寻找K个最大的数组
- 寻找数组的第k个最大者
- 寻找数组中最大的K个数
- 寻找k个数组的最小区间
- 寻找数组最大K个数
- 寻找最大的K个数(TOP K算法)
- 典型的Top K算法_找出一个数组里面前K个最大数
- 用堆排序寻找数组中最大的K个数
- 编程之美2.5 寻找最大的k个树
- 算法->编程之美2.5 寻找最大的K个数
- 【数据结构与算法】寻找最大的K个数
- 寻找最大的K个数
- 寻找最大的K个数
- 寻找最大的k个数
- 寻找最大的K个数
- 寻找最大的K个数
- 寻找最大的K个数
- 寻找最大的K个数
- 逻辑推理 - 挥霍一空
- VC创建虚拟桌面
- 自定义查询设置
- 2011互联网技术发展浅析
- 单调队列+斜率优化的DP
- 【算法】寻找K个最大的数组
- 2011年7月9日 阳光灿烂的重庆
- 职业规划
- 我学ubuntu - ubuntu下用xampp搭建php环境
- C++ STL中迭代器介绍
- .NET组件程序设计 第8章 多线程和并发管理 同步线程_信号
- 黑马程序员:面向对象思想
- w3c dom 常用元素属性和方法
- 【回溯法】装载问题