バイトニックマージはバイトニック分割(Bitonic Split)が終了した後に整列を繰り返します。しかしアルゴリズムの最後のステージでは、バイトニック配列は一つになっているために分割をこれ以上行うことはできません。最後のステージは分割を行わずにマージのみを行い整列済み配列に結合します。
それではバイトニック分割の定義である不等式を再度確認してみましょう。
この場合、nは16なので、インデックスiのペア【0,8】,【1,9】,…,【7,15】で不等式が成立する場合に値をスワップ(入れ替え)します。
一例として前の項目では図を用いて解説した要素16の場合を考えてみましょう。
バイトニック配列を構築はステージ2まで終了しているため、マージをして整列を完了するために新たなステージ3を追加します。
ステージ3(図のstage3)では、4つのステップ(passと呼ぶのが一般的)が存在します。
これらのステップは「表:Bitonic Sort(Stage0からStage3まで)」(表14.4「表:Bitonic Sort(Stage0からStage3まで)」)にまとめられています。
表14.4 表:Bitonic Sort(Stage0からStage3まで)
インデックス | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
元シーケンス | 3 | 7 | 24 | 11 | 78 | 66 | 12 | 8 | 34 | 65 | 43 | 29 | 96 | 41 | 1 | 10 |
stage0 pass0 | 3 | 7 | 24 | 11 | 66 | 78 | 12 | 8 | 34 | 65 | 43 | 29 | 41 | 96 | 10 | 1 |
stage1 pass0 | 3 | 7 | 24 | 11 | 66 | 78 | 12 | 8 | 43 | 65 | 34 | 29 | 10 | 1 | 41 | 96 |
stage1 pass1 | 3 | 7 | 11 | 24 | 78 | 66 | 12 | 8 | 65 | 43 | 34 | 29 | 1 | 10 | 41 | 96 |
stage2 pass0 | 3 | 7 | 11 | 8 | 78 | 66 | 12 | 24 | 65 | 43 | 41 | 96 | 1 | 10 | 34 | 29 |
stage2 pass1 | 3 | 7 | 11 | 8 | 12 | 24 | 78 | 66 | 65 | 96 | 41 | 43 | 34 | 29 | 1 | 10 |
stage2 pass2 | 3 | 7 | 8 | 11 | 12 | 24 | 66 | 78 | 96 | 65 | 43 | 41 | 34 | 29 | 10 | 1 |
stage3 pass0 | 3 | 7 | 8 | 11 | 12 | 24 | 10 | 1 | 96 | 65 | 43 | 41 | 34 | 29 | 66 | 78 |
stage3 pass1 | 3 | 7 | 8 | 1 | 12 | 24 | 10 | 11 | 34 | 29 | 43 | 41 | 96 | 65 | 66 | 78 |
stage3 pass2 | 3 | 1 | 8 | 7 | 10 | 11 | 12 | 24 | 34 | 29 | 43 | 41 | 66 | 65 | 96 | 78 |
stage3 pass3 | 1 | 3 | 7 | 8 | 10 | 11 | 12 | 24 | 29 | 34 | 41 | 43 | 65 | 66 | 78 | 96 |
stage2-pass1でバイトニック配列が完成したあとの、マージのステップを見る場合、分かりやすいのが一番左(インデックス15)の最小値である「1」が、最終的に一番左に移動していることに注目するとよいでしょう。
同様に最大値である「96」の移動を見ると、バイトニック分割によって徐々に整列されていくソートのプロセスが見えてくると思います。
Copyright 2018-2019, by Masaki Komatsu