描述
给定一个数组,统计前k大的数并且把这k个数从大到小输出。
输入
第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。
输出
从大到小输出前k大的数,每个数一行。
样例输入
10
4 5 6 9 8 7 1 2 3 0
5
样例输出
9
8
7
6
5
方法1 直接排序,最多10000个数,快排O(NlogN)不会超时,如果数据再大估计就不行了。听说ACM1秒能处理10^(7~8)个运算。
#include <iostream>
#include <algorithm>
using namespace std;
int main(){
int n,num[100005];
cin>>n;
for(int i=0;i<n;i++){
cin>>num[i];
}
sort(num,num+n);
int k=0;
cin>>k;
for(int i=n-1;i>n-1-k;i--){
cout << num[i]<<endl;
}
return 0;
}
方法2 使用优先队列
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int main(){
int n;
priority_queue<int> Q;
cin>>n;
for(int i=0;i<n;i++){
int a;
cin>>a;
Q.push(a);
}
int k=0;
cin>>k;
for(int i=n-1;i>n-1-k;i--){
cout << Q.top() <<endl;
Q.pop();
}
return 0;
}
补 方法三 归并排序
#include<bits/stdc++.h>
using namespace std;
int num[100005];
int tmp[100005];
void merger(int l,int mid,int r){
int i=l,j=mid+1,m=l;
while(i<=mid&&j<=r){
if(num[i]<num[j]){
tmp[m++]=num[j++];
} else{
tmp[m++]=num[i++];
}
}
while(i<=mid){
tmp[m++]=num[i++];
}
while(j<=r){
tmp[m++]=num[j++];
}
for(int i=l;i<=r;i++){
num[i]=tmp[i];
}
}
void mergersort(int l,int r){
if(l>=r) return;
int mid=(l+r)>>1;
mergersort(l,mid);
mergersort(mid+1,r);
merger(l,mid,r);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
}
mergersort(1,n);
int k;
cin>>k;
for(int i=1;i<=k;i++){
cout << num[i] <<endl;
}
return 0;
}