描述
给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输
出。
Input 第一行包含一个整数n和一个整数m。m < n。n表示数组的大小,n < 100000,m表示前m位最大的数。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开
。每个整数的绝对值不超过100000000。
第三行
output 从大到小输出前m大的数
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 100000
using namespace std;
//int a[]={93,27,30,2,8,12,2,8,30,89};
int a[N];
int swap(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
void arrangeRight(int *a,int s,int e,int k){
if(s>=e)
return ;
int t=a[s];
int i=s,j=e;
while(i!=j){
while(i<j&&t<=a[j]){
--j;
}
swap(a[i],a[j]);
while(j>i&&t>=a[i]){
++i;
}swap(a[i],a[j]);
}
int num=e-i+1;
if(num==k) return;
else if(num>k) arrangeRight(a,i+1,e,k);
else if(num<k) arrangeRight(a,s,i-1,k-num);
}
int main(){
int n,m,k;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
cin>>m;
arrangeRight(a,0,n-1,m);
sort(a+(n-m),a+n);
//for(int i=0;i<n;i++)
//cout<<a[i]<<",";
for(int i=n-1;i>=n-m;i--)
{
cout<<a[i]<<endl;
}
return 0;
}