マージソートは、指定されたリストを半分に分割し、両方の小さなリストを再帰的にソートし、それらを1つのソート済みリストにマージして戻すソートアルゴリズムです。再帰の基本ケースはシングルトンリストに到達しているため、さらに分割することはできませんが、定義ごとに既にソートされています。
リスト上のアルゴリズムの実行は[1,7,6,3,3,2,5]
、次の方法で視覚化できます。
[1,7,6,3,3,2,5]
/ \ split
[1,7,6,3] [3,2,5]
/ \ / \ split
[1,7] [6,3] [3,2] [5]
/ \ / \ / \ | split
[1] [7] [6] [3] [3] [2] [5]
\ / \ / \ / | merge
[1,7] [3,6] [2,3] [5]
\ / \ / merge
[1,3,6,7] [2,3,5]
\ / merge
[1,2,3,3,5,6,7]
タスク
入力として合理的な方法で整数のリストを取り、マージソートアルゴリズムによってソートされている間にこのリストの異なるパーティションを視覚化するプログラムまたは関数を記述します。つまり、上記のようなグラフを出力する必要はありませんが、リストだけで問題ありません。
[1,7,6,3,3,2,5]
[1,7,6,3][3,2,5]
[1,7][6,3][3,2][5]
[1][7][6][3][3][2][5]
[1,7][3,6][2,3][5]
[1,3,6,7][2,3,5]
[1,2,3,3,5,6,7]
さらに、適切なリスト表記は問題ありません。したがって、以下も有効な出力になります。
1 7 6 3 3 2 5
1 7 6 3|3 2 5
1 7|6 3|3 2|5
1|7|6|3|3|2|5
1 7|3 6|2 3|5
1 3 6 7|2 3 5
1 2 3 3 5 6 7
最後に、リストを2つの小さなリストに分割する方法は、結果の両方のリストの長さがせいぜい1つずつ異なる限り、あなた次第です。その手段の代わりに、分割[3,2,4,3,7]
に[3,2,4]
して[3,7]
、あなたはまた、偶数と奇数のインデックス(の要素を取ることによって分割することができ[3,4,7]
かつ[2,3]
)、あるいは分割を毎回ランダム。
これはcode-golfであるため、バイト単位で測定される任意の言語で最も短いコードが優先されます。
テストケース
上記のように、リストを半分に分割する実際の形式と方法はユーザー次第です。
[10,2]
[10][2]
[2,10]
[4,17,1,32]
[4,17][1,32]
[4][17][1][32]
[4,17][1,32]
[1,4,17,32]
[6,5,4,3,2,1]
[6,5,4][3,2,1]
[6,5][4][3,2][1]
[6][5][4][3][2][1]
[5,6][4][2,3][1] <- Important: This step cannot be [5,6][3,4][1,2], because 3 and 4 are on different branches in the the tree
[4,5,6][1,2,3]
[1,2,3,4,5,6]
[[1,2],[3],[4,5],[6]]
マージソートは再帰的に機能するため、実際にはステージは正しいソリューションです。我々が開始した場合それはある[1,2,3,4,5,6]
とに分割[1,2,3]
して[4,5,6]
、それらが最終段階にマージされるまで、これらのリストは、独立して処理されています。
[3]
と[2,1]
、我々はマージすることはできませんので、それらは、異なる枝にある[3]
と[2]
後の[2,1]
分割はにある[2]
と[1]
。