描述
给定一个数组,统计前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<bits/stdc++.h> #include<stdio.h> #include<iostream> using namespace std; int n,k; int a[100000+5]; void find(int l,int r,int ans) { if(l>=r) return ; int ll=l,rr=r; while(l!=r) { while(l<r && a[l]<=a[r]) r--; swap(a[l],a[r]); while(l<r && a[l]<=a[r]) l++; swap(a[l],a[r]); } if(rr-l+1 == ans) return ; rr-l+1 < ans ? find(ll,l-1,ans-(rr-l+1)) :find(l+1,rr,ans); } int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; cin>>k; find(0,n-1,k); sort(a+n-k,a+n); for(int t=n-1;t>=n-k;t--) cout<<a[t]<<endl; return 0; }