niwacchi.log

niwacchiのログ。

PL/SQLでマージソート

PL/SQLで配列のマージソートをしてみた。

配列A…ソート済み

配列B…ソート済み

配列C…配列Aと配列Bをマージソート後の格納用。

idx_a…配列AのINDEX

idx_b…配列BのINDEX



-- 配列Aと配列Bを先頭項目の値の小さい方から順にマージソート

FOR i IN 配列A.FIRST..配列A.LAST + 配列B.LAST

LOOP



-- 配列Aの先頭項目の方が小さい

IF

配列A(idx_a).先頭項目の値 = LEAST(配列A(idx_a).先頭項目の値 配列B(idx_b).先頭項目の値)

THEN

配列C(i) := 配列A(idx_a); -- 配列Aを格納

idx_a := idx_a + 1; -- 配列AのINDEXを次に進める


    • 配列Bの先頭項目の方が小さい

ELSIF

配列B(idx_b).先頭項目の値 = LEAST(配列A(idx_a).先頭項目の値 配列B(idx_b).先頭項目の値)

THEN

配列C(i) := 配列B(idx_a); -- 配列Bを格納

idx_b := idx_b + 1; -- 配列BのINDEXを次に進める

END IF;

END LOOP;



で、配列Aと配列Bをマージソートして配列Cができる。合ってるかな。。

でも、プログラムでこんなことする必要があるときはテーブル構成がマズイよね。