前提・実現したいこと
n番目に小さい数値を求める関数「l-select」を作成しているのですが、A[1..n]という配列が与えられたときにA[1..n]の要素を5個の要素からなるグループに分ける方法が分かりません。
以下、l-selectのアルゴリズムです。
procedure l-select (A = [1..n], k);
if n < 50 then
begin A[1..n]をソートする;
return A[k] end
else begin
A[1..n]の要素を5個の要素からなるグループに分ける;
5個の要素からなる各グループをソートする; (このソート方法はバブルソート)
Mを5個の要素からなるグループの中央値の集合とする;
m := l-select(M, [|M| / 2]);
S1 := (A[1..n]のmより小さい要素の全て);
S2 := (A[1..n]のmと等しい要素の全て);
S3 := (A[1..n]のmより大きい要素の全て);
if |S1| >= k then return l-select(S1, k);
else if |S1| + |S2| >= k then return m;
else return l-select(S3, k - |S1| - |S2|);
end
補足情報(FW/ツールのバージョンなど)
Cygwin64
まだ回答がついていません
会員登録して回答してみよう