题目:输入n个整数,输出其中最小的k个。
算法思想,要是将n个数排序然后输出前k个,方法很简单,但计算量比较大,为O(nlogn)。
要是新建一个有k个元素数组,在数组不满时,将每一个输入的数据存入数组。若数组满了,则比较输入的数据与数组中最大元素的大小,来决定接下来干什么,接下来干什么,你懂的。我语言表达能力不行,就这么凑活看吧。这样的话,需要排序数组k,计算复杂度变为
O(n+klogk)。要是k<<n,这样很划得来。
#include<iostream> #include<set> #include<vector> using namespace std; void findMinK(vector<int> &sourceset,multiset<int,greater<int>> &minK,int k) { if(k == 0 || k > sourceset.size()) return; vector<int>::iterator soriter = sourceset.begin(); while(soriter != sourceset.end()) { if(minK.size() < k) minK.insert(*soriter); else { multiset<int,greater<int>>::iterator multiiter = minK.begin(); if(*multiiter > *soriter) { minK.erase(multiiter); minK.insert(*soriter); } } soriter++; } } int main() { vector<int> sorset; multiset<int,greater<int>> intmulti; int tmp = 0; cout<<"Input source data:"<<endl; cin>>tmp; while(tmp != 0) { sorset.push_back(tmp); //sorset.insert(tmp); cin>>tmp; } cout<<"Input K:"; int k = 0; cin>>k; findMinK(sorset,intmulti,k); multiset<int,greater<int>>::iterator multiiter = intmulti.begin(); while(multiiter != intmulti.end()) { cout<<*multiiter<<" "; multiiter++; } cout<<endl; system("pause"); }
那个findMinK()的第一个参数是一个集合,记录输入的数据,也可以改一改把这个变量去掉,直接在线输入n个数,然后输出k个最小的。好像后者更好,可是代码已经写完了,也就懒得改了,就这样吧。
main()中,输入数据时以输入0结束,这不是个好的方法,可是不知道怎么结束,这个问题困扰我很久了。希望有人可以告诉我。。。。。