010:輸出前k大的數
阿新 • • 發佈:2018-06-03
algorithm -i cstring swap names 一行 while cto 一個
- 描述
-
給定一個數組,統計前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(inta[],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\n",a[i]); } return 0; }
010:輸出前k大的數