用堆排序的思想求最小的k个数,处理海量数据
来源:互联网 发布:而又何羡乎特殊句式 编辑:程序博客网 时间:2024/05/29 18:23
//最小的k个数//输入n个整数,输出其中最小的k个数//解答:虽然利用快排的思想很好的解决了问题,但是也有限制,首先我们需要一次性读入所以的数据,其次,需要修改输入的数组//利用堆排序来解决此问题,此种方法适合处理海量数据//首先我们先读入k个元素创建一个大小为k的大根堆,然后我们依次读入剩下的数据,如果当前数据比大根堆的堆顶小,则用这个数代替当前//堆顶,并调整堆使其保持大根堆的性质;如果当前数据比堆顶大,那么这个数不可能是最小的k个整数之一,故可以抛弃此数,此种方法的复杂度为O(nlogk)#include<iostream>using namespace std;void AdjustDown(int *data,int i,int len){if(data==NULL||i<=0||len<=0||i>len)return;int nchild;for(;2*i+1<len;i=nchild){nchild=2*i+1;if(nchild<len-1&&data[nchild+1]>data[nchild])nchild++;if(data[i]<data[nchild])swap(data[i],data[nchild]);elsebreak;}}void BuildMax(int *a,int n){if(a==NULL||n<=0)return;for(int i=n/2-1;i>=0;i--)AdjustDown(a,i,n);}void main(){int data[]={1,3,5,6,2,4,8,7};int len=sizeof(data)/sizeof(int);int k;cin>>k;if(k>len||k<=0)return;int *b=new int[k];for(int i=0;i<k;i++){b[i]=data[i];}BuildMax(b,k);for(int i=k;i<len;i++){if(data[i]>b[0])continue;else{b[0]=data[i];AdjustDown(b,0,k);}}for(int i=0;i<k;i++)cout<<b[i]<<" ";delete []b;}
0 0
- 用堆排序的思想求最小的k个数,处理海量数据
- 寻找最小的k个数,处理海量数据的思想
- 求数组中最小的k个数以及海量数据最大堆、multiset解决方案
- 二.用最小堆方法找出海量数据中最小的k个数
- 最小的k个数--适合处理海量数据
- 堆处理海量数据----求前k个最小的数--时间复杂度(n * log k)
- 堆排序(最小的K个数)
- 【java】堆排序 最小的k个数
- 求最小的K个数 O(N) 一种实现-基于堆排序
- 从海量数据中找出最小的k个数
- 利用堆求最大或最小的前k个数
- 利用MapReduce求海量数据中最大的K个数
- 海量数据最小k个数
- 用快速排序的思想求第K大的数或最大的k个数
- 求最小的K个数
- 求最小的k个数
- 求最小的k个数
- 九度OJ 1371 最小的K个数 -- 堆排序
- 【回文串】HDU 3294 Girls' research manacher算法
- UILabel设定行间距方法
- 栈的操作(创建,入栈,出栈,清空,遍历等等)
- 217Contains Duplicate
- 关于矩形排样问题(二)
- 用堆排序的思想求最小的k个数,处理海量数据
- Freemarker操作字符串
- 常见错误描述: Undefined symbols for architecture i386
- Transform
- [置顶] 一位ACMer过来人的心得
- maven 安装
- 南阳oj 题目75 日期计算
- 黑马程序员-Java基础---IO流介绍
- 王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典