题目:输入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

代码如下:

 

 
  1. #include <iostream>  
  2. #include<vector>  
  3. #include <set>  
  4. using namespace std;  
  5.    
  6. typedef multiset<int,greater<int> > Heap;  
  7. void FindMink(vector<int> data,Heap &mink,int k)  
  8. {  
  9.     mink.clear();  
  10.     vector<int>::iterator iter=data.begin();  
  11.     for(;iter!=data.end();iter++)  
  12.     {  
  13.         if(mink.size()<k)  
  14.             mink.insert(*iter);  
  15.         else 
  16.         {  
  17.             multiset<int,greater<int> >::iterator minter=mink.begin();  
  18.             if(*iter<*minter)  
  19.             {  
  20.                 mink.erase(minter);  
  21.                 mink.insert(*iter);  
  22.             }  
  23.         }  
  24.     }  
  25. }  
  26.  
  27. void main()  
  28. {  
  29.     int  a[]={13,2,5,1,7,5,9,7,23,4};  
  30.     vector<int> b(a,a+10);  
  31.     Heap min;  
  32.     FindMink(b,min,4);  
  33.     multiset<int,greater<int> >::iterator minter=min.begin();  
  34.     for(;minter!=min.end();minter++)  
  35.         cout<<*minter<<"  ";