1. 程式人生 > >010:輸出前k大的數

010:輸出前k大的數

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(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\n",a[i]); } return 0; }

010:輸出前k大的數