- 描述
-
给定一个数组,统计前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
查看
运用快速排序思想,将区间分成两半,一半比某个数都大,一半比某个数都小。
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<cstring> #define DEBUG(x) cout << #x << " = " << x << endl using namespace std; const int MAXN=1e5+10; int N; int a[MAXN]; bool cmp(int a,int b) { return a>b; } int arrangeRight(int a[],int l,int r,int k) { // if(r-l+1==k){ // return l; // } int i=l,j=r; int n=r-l+1; int key=a[l]; while(i<j){ while(i<j&&a[j]>=key)j--; swap(a[i],a[j]); while(i<j&&a[i]<=key)i++; swap(a[i],a[j]); } if(r-i+1==k){ return i; } else if(r-i+1>k){ return arrangeRight(a,i+1,r,k); } else { return arrangeRight(a,l,i-1,k-(r-i+1)); } } int main() { // freopen("in.txt","r",stdin); scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%d",&a[i]); } int M; scanf("%d",&M); int p=arrangeRight(a,0,N-1,M); sort(a+p,a+N,cmp); for(int i=p;i<N;i++){ printf("%d ",a[i]); } return 0; }