L'ordinamento non ha senso per un array bidimensionale ... o no?
Il tuo compito è prendere una griglia di input e applicare un algoritmo simile a una bolla fino a quando tutti i valori nella griglia non sono decrescenti da sinistra a destra e dall'alto verso il basso lungo ogni riga e colonna.
L'algoritmo funziona come segue:
- Ogni passaggio va riga per riga, dall'alto verso il basso, confrontando / scambiando ogni cella con i suoi vicini destro e sotto.
- se la cella è più grande di solo una delle sue vicine destra e sotto, scambia con quella che è maggiore di
- se la cella è più grande sia della sua destra che della vicina, scambia con il vicino più piccolo
- se la cella è maggiore sia dei vicini di destra che di quelli inferiori, che hanno lo stesso valore, scambia con il vicino di sotto.
- se la cella non è maggiore di uno dei suoi vicini di destra e sotto, non fare nulla
- Continua fino a quando non vengono effettuati scambi durante l'intero passaggio. Questo avverrà quando ogni riga e colonna sono in ordine, da sinistra a destra e dall'alto verso il basso.
Esempio
4 2 1
3 3 5
7 2 1
La prima riga del passaggio scambia il 4 e il 2, quindi il 4 con l'1.
2 1 4
3 3 5
7 2 1
Quando otteniamo il 3 centrale, verrà scambiato con il 2 in basso
2 1 4
3 2 5
7 3 1
Quindi il 5 viene scambiato con il 1 in basso
2 1 4
3 2 1
7 3 5
L'ultima riga del primo passaggio sposta il 7 completamente a destra
2 1 4
3 2 1
3 5 7
Quindi torniamo di nuovo alla riga superiore
1 2 1
3 2 4
3 5 7
E continua riga per riga ...
1 2 1
2 3 4
3 5 7
... fino a quando la griglia non viene "ordinata"
1 1 2
2 3 4
3 5 7
Un altro esempio
3 1 1
1 1 1
1 8 9
diventa
1 1 1
1 1 1
3 8 9
piuttosto che
1 1 1
1 1 3
1 8 9
perché lo scambio al ribasso ha la priorità quando entrambi i vicini destro e inferiore di una cella sono uguali.
Un'implementazione di riferimento dettagliata può essere trovata qui .
Casi test
5 3 2 6 7 3 1 0
3 2 1 9 9 8 3 0
3 2 2 8 9 8 7 6
diventa
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
diventa
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
Regole
- Puoi prendere la griglia di input in qualsiasi formato conveniente
- Si può presumere che i valori della griglia siano tutti numeri interi non negativi nell'intervallo a 16 bit senza segno (0-65535).
- Si può presumere che la griglia sia un rettangolo perfetto e non un array frastagliato. La griglia sarà almeno 2x2.
- Se si utilizza un altro algoritmo di ordinamento, è necessario fornire una prova che produrrà sempre lo stesso ordine risultante di questo particolare marchio di ordinamento a bolle 2D, indipendentemente dall'input. Mi aspetto che sia una prova non banale, quindi probabilmente starai meglio usando l'algoritmo descritto.
Buon golf!