n個の数の中で最大のm個の数字を探し出す(速く思想を並べます)
1304 ワード
分析:この問題は、私が前に出会ったときに考えた解決策は、最小スタックの解決方法です.個数mの最小スタックを確立し、nを遍歴してこの最小スタックを維持すればよい.アルゴリズムの時間複雑度はn*log(m)である.やはり比較的効率的なアルゴリズムです.
今日私はまた1種の解決方法を発見して、それはSTLの中の1種のアルゴリズムで、STLの中のnth_elementはこのようなアルゴリズムです.高速ソートと同様のプロセスを用いて,前の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;
}