(分治)7617:输出前k大的数

描述 
给定一个数组,统计前k大的数并且把这k个数从大到小输出。

输入 
第一行包含一个整数n,表示数组的大小。n < 100000。 
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。 
第三行包含一个整数k。k < n。

输出 
从大到小输出前k大的数,每个数一行。

样例输入 
10 
4 5 6 9 8 7 1 2 3 0 
5

样例输出 




5

我の思考 
这个题看起来不难,数字比较大,就是希望我们在时间上能少一点,然后我们就去避免把去排序所有的数字。我们就假设这个k值,分成大于k的和小于k的。如果我们要输出的k比排序后得到的大的部分的数组相等或者要小,我们就排序这里的。如果还欠了数字,我们就把剩下的小数组里面取出排在前n-k个的。

我の代码

#include <iostream>
#include <algorithm>
using namespace std;
int x[100005];
int b[100005];
int c[100005];
int j=0;
int m=0;
bool cmp(int one,int two){
    return one>two;
}

void func(int* a,int k,int y){
    sort(a,a+y,cmp);
    for(int n=0;n<k;n++){
        cout<<a[n]<<endl;
    }
    if(k-1<=y){
        return;
    }

    if(k-1>y){
        func(b,k-y,j);
    }
}

int main()
{

    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>x[i];
    }

    int k;
    cin>>k;

    for(int i=0;i<n;i++){
        if(x[i]<k){
            b[j]=x[i];
            j++;
        }else{
            c[m]=x[i];
            m++;
        }
    }

    func(c,k,m);
    return 0;
}

我の小结 
其实之前还不熟悉sort函数的用法还有头文件QAQ,然后发现自己写的代码还是有点臃肿。