Le tri n'a aucun sens pour un tableau à deux dimensions ... ou pas?
Votre tâche consiste à prendre une grille d'entrée et à lui appliquer un algorithme de type bulle jusqu'à ce que toutes les valeurs de la grille ne diminuent pas de gauche à droite et de haut en bas le long de chaque ligne et colonne.
L'algorithme fonctionne comme suit:
- Chaque passe va ligne par ligne, de haut en bas, en comparant / échangeant chaque cellule avec ses voisins droit et inférieur.
- si la cellule est supérieure à un seul de ses voisins droit et inférieur, échangez avec celle dont elle est supérieure à
- si la cellule est supérieure à ses voisins droit et inférieur, échangez avec le voisin plus petit
- si la cellule est supérieure à ses voisins droit et inférieur, qui sont de la même valeur, échangez avec le voisin inférieur.
- si la cellule n'est pas plus grande que ses voisins droit et inférieur, ne faites rien
- Continuez jusqu'à ce qu'aucun échange ne soit effectué tout au long du passage. Ce sera lorsque chaque ligne et colonne sera dans l'ordre, de gauche à droite et de haut en bas.
Exemple
4 2 1
3 3 5
7 2 1
La première rangée de la passe permutera le 4 et le 2, puis le 4 avec le 1.
2 1 4
3 3 5
7 2 1
Lorsque nous aurons le 3 du milieu, il sera échangé avec le 2 ci-dessous
2 1 4
3 2 5
7 3 1
Ensuite, le 5 est échangé avec le 1 ci-dessous
2 1 4
3 2 1
7 3 5
La dernière rangée de la première passe déplace le 7 complètement à droite
2 1 4
3 2 1
3 5 7
Ensuite, nous revenons à la rangée du haut
1 2 1
3 2 4
3 5 7
Et continuez ligne par ligne ...
1 2 1
2 3 4
3 5 7
... jusqu'à ce que la grille soit "triée"
1 1 2
2 3 4
3 5 7
Un autre exemple
3 1 1
1 1 1
1 8 9
devient
1 1 1
1 1 1
3 8 9
plutôt que
1 1 1
1 1 3
1 8 9
car l'échange vers le bas est prioritaire lorsque les voisins droit et inférieur d'une cellule sont égaux.
Une implémentation de référence étape par étape peut être trouvée ici .
Cas de 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
devient
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
devient
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
Règles
- Vous pouvez prendre la grille d'entrée dans n'importe quel format pratique
- Vous pouvez supposer que les valeurs de la grille sont toutes des entiers non négatifs dans la plage de 16 bits non signée (0-65535).
- Vous pouvez supposer que la grille est un rectangle parfait et non un tableau dentelé. La grille sera au moins 2x2.
- Si vous utilisez un autre algorithme de tri, vous devez fournir une preuve qu'il produira toujours le même ordre résultant que cette marque particulière de tri à bulles 2D, quelle que soit l'entrée. Je m'attends à ce que ce soit une preuve non triviale, donc vous feriez probablement mieux d'utiliser l'algorithme décrit.
Bon golf!