Сортування не має сенсу для двовимірного масиву ... чи це?
Ваше завдання - взяти вхідну сітку і застосувати до неї алгоритм, подібний до міхура, доки всі значення в сітці не зменшаться зліва направо і зверху вниз уздовж кожного рядка та стовпця.
Алгоритм працює наступним чином:
- Кожен прохід йде рядка за рядком, зверху вниз, порівнюючи / міняючи кожну клітинку правою і нижче сусідами.
- якщо клітинка більша, ніж лише один її правий і нижчий сусідів, поміняйте місцями на той, на який він більший
- якщо клітина більше, ніж її права та нижче сусідів, поміняйте місцями на менший сусід
- якщо комірка більше, ніж її права та нижче сусіди, які мають однакове значення, то поміняйте місцями на сусіднього нижче.
- якщо осередок не більший за його право і нижче сусідів, нічого не робіть
- Продовжуйте це до тих пір, поки не буде зроблено будь-яких замінів протягом усього проходу. Це буде, коли кожен рядок і стовпець у порядку, зліва направо і зверху вниз.
Приклад
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).
- Ви можете припустити, що сітка - це ідеальний прямокутник, а не зубчастий масив. Сітка буде не менше 2х2.
- Якщо ви використовуєте інший алгоритм сортування, ви маєте надати доказ того, що він завжди створюватиме такий самий порядок, що й отриманий, як цей конкретний бренд 2D сортування міхурів, незалежно від того, який вхід є. Я очікую, що це буде нетривіальним доказом, тому вам, мабуть, краще скористатися описаним алгоритмом.
Щасливого гольфу!