二.用最小堆方法找出海量数据中最小的k个数
2015-06-26 12:21
295 查看
思路:用数组b模拟海量数据的数组,数组a存放最小的k个数,首先将数组b的前k个数赋值给a,对a建最大堆,则此时a[0]存放a的最大元素,然后遍历b中k
以后的数据和a[0]比较,如果比a[0]小,则赋值给a[0],并且对a进行重新的调整是a[0]仍然最大,这样知道把b遍历完为止。
调整堆用时logk,遍历b用时n,时间复杂度nlogb
以后的数据和a[0]比较,如果比a[0]小,则赋值给a[0],并且对a进行重新的调整是a[0]仍然最大,这样知道把b遍历完为止。
调整堆用时logk,遍历b用时n,时间复杂度nlogb
#include<iostream> using namespace std; void adjustHeap(int a[],int s,int n) { int temp=a[s]; for(int i=2*s+1;i<=n;i=i*2+1) { if((i+1)<=n&&a[i]<a[i+1]) i++; if(temp>a[i]) break; a[s]=a[i]; s=i; } a[s]=temp; } void heap_buid(int a[],int n) { for(int i=n/2-1;i>=0;i--) { adjustHeap(a,i,n-1); } /*for(int i=n-1;i>=1;i--) { swap(a[0],a[i]); adjustHeap(a,0,i-1); }*/ } void main() { int k; int b[]={7,3,9,0,1,2,5,10,100,-1,-2}; int n=sizeof(b)/sizeof(int); cout<<"b:"; for(int i=0;i<n;i++) { cout<<b[i]<<" "; } cout<<endl; cout<<"请输入要找出最小的多少位数"<<endl; cin>>k; int *a=(int*)malloc(sizeof(int)*k); for(int i=0;i<k;i++) { a[i]=b[i]; } heap_buid(a,k); cout<<"a1:"; for(int i=0;i<k;i++) { cout<<a[i]<<" "; } cout<<endl; for(int i=k;i<n;i++) { if(a[0]>b[i]) { a[0]=b[i]; adjustHeap(a,0,k-1); } } cout<<"a2:"; for(int i=0;i<k;i++) { cout<<a[i]<<" "; } cout<<endl; system("pause"); }
相关文章推荐
- 查找jar包中类的小工具
- iOS 9系统安装空间需求下降至1.8GB
- Step into Kotlin - 03 - 变量,常量与表达式
- CInstantCamera 例子1
- java学习之旅21--for语句
- Activiti初学者教程
- JAVA网络编程之——TCP通信
- Step into Kotlin - 02 - 数据类型
- Uncaught TypeError: Illegal invocation
- 递归与分治:循环赛日程表
- [SoapUI] 按照 Test Step Type 获取所有满足条件的 Test Step
- Android中Parcelable接口用法
- 学习记录:对maven项目使用命令下载jar包
- 《爱编程,爱c++-十八期-对象》
- Linux touch 命令
- AFNetworking框架的使用
- ADI实验室电路:带抗混叠滤波器的宽带接收机
- SQL SERVER性能分析
- 《中华人民共和国著作权法》
- HBase学习总结(1):HBase的下载与安装