すべての値を並べ替えて最初の K 値を選択すれば、問題は簡単です。しかし、配列全体がソートされる前に最小の K 値がソートされている可能性があるため、時間がかかりすぎます。この問題を解決するには、コードにフラグを追加する方法があると思いますが、最小の k 値がソートされたかどうかを判断するフラグの付け方がわかりません。
質問する
1689 次
2 に答える
3
ランダム選択アルゴリズムを使用して、この問題を O(n) 時間で解決できます。最後に、0 から k までの部分配列を返すだけです。
于 2012-12-05T05:32:12.550 に答える
2
k番目に小さい値を見つけることで問題を解決できると思います。partition
クイックソートの関数のシグネチャが であると仮定するとint partition(int* array, int start, int end)
、基本的な考え方を示す疑似コードは次のとおりです。
int select(int[] a, int start, int end, int k)
{
j = partition(a,start,end);
if( k == j)
return a[j];
if( k < j )
select(a,start,j-1,k);
if( k > j )
select(a,j+1,end,k-j);
}
index = select(a, 0, length_of_a, k);
次に、a[0...index] は、配列 a の最初の k 個の最小値です。並べ替えたい場合は、[0...index] をさらに並べ替えることができます。
于 2012-12-05T05:31:18.813 に答える