二.用最小堆方法找出海量数据中最小的k个数

来源:互联网 发布:网络黄金egd是传销吗 编辑:程序博客网 时间:2024/06/10 21:54

思路:用数组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


#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");}


0 0
原创粉丝点击