n個の数の中で最大のm個の数字を探し出す(速く思想を並べます)


分析:この問題は、私が前に出会ったときに考えた解決策は、最小スタックの解決方法です.個数mの最小スタックを確立し、nを遍歴してこの最小スタックを維持すればよい.アルゴリズムの時間複雑度はn*log(m)である.やはり比較的効率的なアルゴリズムです.
今日私はまた1種の解決方法を発見して、それはSTLの中の1種のアルゴリズムで、STLの中のnth_elementはこのようなアルゴリズムです.高速ソートと同様のプロセスを用いて,前のm個の最大数を見つけた.
あまり言わないで、コードを見てください.コードから分かるように、速い列と基本的に似ています.
#include 
#include 
using namespace std;

// m        n  
//   M[m]     n(n= m) return;
    int t = M[0];
    int i = 0, j = m - 1;
    while (i < j) {
        while (i < j && M[j] < t) --j;
        if (i < j) M[i++] = M[j];

        while (i < j && M[i] >= t) ++i;
        if (i < j) M[j--] = M[i];
    }
    M[i] = t;
    if (i < n) {
        search(&M[i+1], m - i - 1, n - i - 1);
    } else if (i > n) {
        search(M, i, n);
    }
    return;
}

void test()
{
    int M[] = {8, 3, 9, 0, 4, 2, 5, 7, 1, 6};
    int m = 10, n = 6;

    printf("    :");
    for(int i =  0; i < m; ++i)
        printf("%d ", M[i]);
    printf("
"); search(M, m, n); printf(" :"); for(int i = 0; i < n; ++i) printf("%d ", M[i]); printf("
"); } int main() { test(); return 0; }