010:输出前k大的数

描述

给定一个数组,统计前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;
}
原文地址:https://www.cnblogs.com/MalcolmMeng/p/9128050.html