並べ替えは2次元配列には意味がありません...またはそれを行いますか?
あなたのタスクは、入力グリッドを取得し、グリッド内のすべての値がすべての行と列に沿って左から右、上から下に減少しないまで、バブルソートのようなアルゴリズムを適用することです。
アルゴリズムは次のように機能します。
- 各パスは、行ごとに上から下に進み、各セルをその右および下の隣接セルと比較/交換します。
- セルがその右隣と下隣のいずれか1つよりも大きい場合、それより大きいセルと交換します
- セルが右隣と下隣の両方よりも大きい場合、小さい隣と交換します
- セルが右隣と下隣の両方(同じ値)よりも大きい場合は、下隣と交換します。
- セルがその右隣および下隣のいずれよりも大きくない場合、何もしない
- パス全体でスワップが行われないまでこれを続けます。これは、すべての行と列が左から右へ、上から下へ順番に並んでいるときです。
例
4 2 1
3 3 5
7 2 1
パスの最初の行は4と2を交換し、次に4を1と交換します。
2 1 4
3 3 5
7 2 1
中間の3を取得すると、以下の2と交換されます
2 1 4
3 2 5
7 3 1
次に、5は下の1と交換されます
2 1 4
3 2 1
7 3 5
最初のパスの最後の行は、7を右端まで移動します
2 1 4
3 2 1
3 5 7
その後、再び最上行に戻ります
1 2 1
3 2 4
3 5 7
そして、行ごとに続けます...
1 2 1
2 3 4
3 5 7
...グリッドが「ソート」されるまで
1 1 2
2 3 4
3 5 7
もう一つの例
3 1 1
1 1 1
1 8 9
になる
1 1 1
1 1 1
3 8 9
のではなく
1 1 1
1 1 3
1 8 9
セルの右隣と下隣の両方が等しい場合、下向きのスワップが優先されるためです。
ステップバイステップのリファレンス実装はこちらにあります。
テストケース
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
になる
0 0 1 1 2 2 3 6
2 2 3 3 6 7 8 8
3 3 5 7 8 9 9 9
2 1 2 7 8 2 1 0
2 2 2 2 3 2 1 0
1 2 3 4 5 4 3 2
9 8 7 6 5 4 3 6
6 5 4 3 2 2 1 0
になる
0 0 0 1 1 1 2 2
1 1 2 2 2 2 2 2
2 2 2 2 3 3 3 3
3 4 4 4 4 5 6 6
5 5 6 7 7 8 8 9
ルール
- 任意の便利な形式で入力グリッドを取ることができます
- グリッド値はすべて、符号なし16ビット範囲(0〜65535)の非負整数であると想定できます。
- グリッドは、ギザギザの配列ではなく完全な長方形であると想定できます。グリッドは少なくとも2x2になります。
- 別の並べ替えアルゴリズムを使用する場合は、入力が何であっても、この特定のブランドの2Dバブル並べ替えと同じ結果の順序が常に生成されることを証明する必要があります。これは自明ではない証拠になると予想されるので、説明されているアルゴリズムを使用する方がよいでしょう。
ハッピーゴルフ!