题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。思路:设一个大小为k的数组min来保存最小的k个数,先用n个整数的前k个数来初始化数组min,对于从第k+1个数起,与数组min中的最大数进行比较,如果第k+1个数小于数组min中的最大数,则用第k+1个数代替数组min中的最大数,再重新求出数组min中的最大数,依次类推,更新数组min
用C++的STL的multiset来实现数组min
代码如下:
- #include <iostream>
- #include<vector>
- #include <set>
- using namespace std;
- typedef multiset<int,greater<int> > Heap;
- void FindMink(vector<int> data,Heap &mink,int k)
- {
- mink.clear();
- vector<int>::iterator iter=data.begin();
- for(;iter!=data.end();iter++)
- {
- if(mink.size()<k)
- mink.insert(*iter);
- else
- {
- multiset<int,greater<int> >::iterator minter=mink.begin();
- if(*iter<*minter)
- {
- mink.erase(minter);
- mink.insert(*iter);
- }
- }
- }
- }
- void main()
- {
- int a[]={13,2,5,1,7,5,9,7,23,4};
- vector<int> b(a,a+10);
- Heap min;
- FindMink(b,min,4);
- multiset<int,greater<int> >::iterator minter=min.begin();
- for(;minter!=min.end();minter++)
- cout<<*minter<<" ";
- }