Lutece Problem 528-输出前m大的数

2019-12-20  本文已影响0人  小菜变大菜

题目

原题地址
利用快排的思想,首先将前m的数移至数组右边,然后用内置sort函数对这m个数排序,最后输出即可。
为什么不能直接全局sort,然后输出m个数呢?因为这样的题目数组特别大,复杂度特别高。这里我们运用快排的思想找到前m大的数只花费了O(n)的时间,另外排序花了O(m\log m),总复杂度为O(n+m\log m),比O(n\log n)小很多。

#include <iostream>
#include <algorithm>

using namespace std;
#define maxn 1000100
int A[maxn];
int n,m;

//将数组l到r位置前k大的数移到l到r位置的右边
void move_right(int *A, int l, int r, int k){
    if(l>r) return;
    int i=l,j=r;
    int key=A[l];
    while(i!=j){
        if(i<j&&A[j]>=key) --j;
        swap(A[i],A[j]);
        if(i<j&&A[i]<=key) ++i;
        swap(A[i],A[j]);
    }
    int len = r-i+1;
    if(len==k) return;
    else if(len>k) move_right(A, i+1, r, k);
    else move_right(A,l,i-1,k-len);
}

int main()
{
    while(cin>>n>>m){
        for(int i=0; i<n;i++) cin >> A[i];
        //memset(A, 0, sizeof(A));
        move_right(A,0,n-1,m);
        sort(A+n-m,A+n); //将右边的m个数升序排序
        for(int i=n-1;i>=n-m;i--) cout << A[i] << " ";
    }
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读