Sortieren macht für ein zweidimensionales Array keinen Sinn ... oder doch?
Ihre Aufgabe ist es, ein Eingabegitter zu nehmen und einen Algorithmus anzuwenden, der einer Blasensortierung ähnelt, bis alle Werte im Gitter in jeder Zeile und Spalte nicht mehr von links nach rechts und von oben nach unten abnehmen.
Der Algorithmus funktioniert wie folgt:
- Jeder Durchgang erfolgt zeilenweise von oben nach unten, wobei jede Zelle mit ihren rechten und unteren Nachbarn verglichen / ausgetauscht wird.
- Ist die Zelle größer als nur eine ihrer rechten und unteren Nachbarn, tauschen Sie sie gegen diejenige aus, die größer als ist
- Ist die Zelle größer als die rechte und die untere Nachbarzelle, tauschen Sie sie mit dem kleineren Nachbarn aus
- Wenn die Zelle größer ist als ihre rechten und unteren Nachbarn, die den gleichen Wert haben, tauschen Sie sie mit dem unteren Nachbarn aus.
- Wenn die Zelle nicht größer als eine der rechten und unteren Nachbarn ist, nichts tun
- Fahren Sie so lange fort, bis während des gesamten Passes keine Auslagerungen mehr vorgenommen werden. Dies ist der Fall, wenn alle Zeilen und Spalten von links nach rechts und von oben nach unten angeordnet sind.
Beispiel
4 2 1
3 3 5
7 2 1
Die erste Reihe des Passes wird die 4 und die 2, dann die 4 mit der 1 tauschen.
2 1 4
3 3 5
7 2 1
Wenn wir die mittlere 3 bekommen, wird sie mit der 2 unten getauscht
2 1 4
3 2 5
7 3 1
Dann werden die 5 mit der 1 getauscht
2 1 4
3 2 1
7 3 5
Die letzte Reihe des ersten Durchgangs bewegt die 7 ganz nach rechts
2 1 4
3 2 1
3 5 7
Dann kehren wir wieder in die oberste Reihe zurück
1 2 1
3 2 4
3 5 7
Und weiter Zeile für Zeile ...
1 2 1
2 3 4
3 5 7
... bis das Raster "sortiert" ist
1 1 2
2 3 4
3 5 7
Ein anderes Beispiel
3 1 1
1 1 1
1 8 9
wird
1 1 1
1 1 1
3 8 9
eher, als
1 1 1
1 1 3
1 8 9
weil der Downward-Swap Vorrang hat, wenn sowohl der rechte als auch der untere Nachbar einer Zelle gleich sind.
Eine schrittweise Referenzimplementierung finden Sie hier .
Testfälle
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
wird
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
wird
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
Regeln
- Sie können das Eingaberaster in einem beliebigen Format verwenden
- Sie können davon ausgehen, dass die Rasterwerte alle nicht negative ganze Zahlen im vorzeichenlosen 16-Bit-Bereich (0-65535) sind.
- Sie können annehmen, dass das Raster ein perfektes Rechteck und kein gezacktes Array ist. Das Gitter wird mindestens 2x2 sein.
- Wenn Sie einen anderen Sortieralgorithmus verwenden, müssen Sie einen Beweis dafür liefern, dass immer die gleiche resultierende Reihenfolge wie bei dieser speziellen Marke der 2D-Blasensortierung erzielt wird, unabhängig von der Eingabe. Ich gehe davon aus, dass dies ein nicht trivialer Beweis ist. Daher ist es wahrscheinlich besser, den beschriebenen Algorithmus zu verwenden.
Viel Spaß beim Golfen!