华为机试——最小k个数

输入n个整数,输出其中最小的K个,算法复杂度为O(nlogk)

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;

typedef multiset<int,greater<int> >  intSet;
typedef multiset<int,greater<int> >::iterator setIterator;

void GetLeastKNumbers(const vector<int>& data,intSet& leastNumbers,int k)
{
    leastNumbers.clear();
    if(data.size()<k||k<1)
        return;
    vector<int>::const_iterator it=data.begin();
    for(;it!=data.end();it++)
    {
        if(leastNumbers.size()<k)
            leastNumbers.insert(*it);
        else
        {
            setIterator greatest=leastNumbers.begin();
            if(*it<*greatest)
            {
                leastNumbers.erase(greatest);
                leastNumbers.insert(*it);
            }
        }
    }
}

int main()
{
    int n,k;
    int number;
    vector<int> data;
    intSet leastNumbers;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>number;
        data.push_back(number);
    }
    cin>>k;
    GetLeastKNumbers(data,leastNumbers,k);
    for(setIterator it=leastNumbers.begin();it!=leastNumbers.end();++it)
        cout<<*it<<" ";
    cout<<endl;
}