Сортировка не имеет смысла для двумерного массива ... или нет?
Ваша задача - взять входную сетку и применить к ней алгоритм, подобный пузырьковой сортировке, пока все значения в сетке не будут уменьшаться слева направо и сверху вниз по каждой строке и столбцу.
Алгоритм работает следующим образом:
- Каждый проход идет строка за строкой сверху вниз, сравнивая / меняя каждую ячейку с ее правыми и нижними соседями.
- если ячейка больше, чем только один из ее правых и нижних соседей, поменяйте местами с той, что больше
- если ячейка больше, чем ее правые и нижние соседи, поменяйте местами с меньшим соседом
- если ячейка больше, чем ее правые и нижние соседи, которые имеют одинаковое значение, то поменяйте местами с нижним соседом.
- если ячейка не больше, чем любой из ее правых и ниже соседей, ничего не делать
- Продолжайте до тех пор, пока на протяжении всего прохода не будет выполнено никаких перестановок. Это будет, когда все строки и столбцы расположены по порядку, слева направо и сверху вниз.
пример
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.
- Если вы используете другой алгоритм сортировки, вы должны предоставить доказательство того, что он всегда будет производить тот же результирующий порядок, что и конкретный бренд двумерной пузырьковой сортировки, независимо от того, какой будет ввод. Я ожидаю, что это будет нетривиальным доказательством, поэтому вам лучше использовать описанный алгоритм.
Счастливого гольфа!
Ответы:
JavaScript (Node.js) , 129 байт
Попробуйте онлайн!
источник
APL (Dyalog Unicode) , 75 байтов SBCS
Спасибо @ Adám за сохранение 11 байтов.
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 183 байта
Попробуйте онлайн!
Я не эксперт по Mathematica, я уверен, что это можно сделать короче. В частности, я думаю, что двойное выражение if можно сократить с помощью,
Transpose
но я не знаю как.источник
R ,
169165144132 байтПопробуйте онлайн!
источник
Чистый , 240 байт
Попробуйте онлайн!
Реализует алгоритм точно так, как описано.
Ссылка включает в себя синтаксический анализ ввода, чтобы принять формат в вопросе.
источник
Python 2 ,
215208 байтПопробуйте онлайн!
-7 байт, благодаря овсу
источник
C # (.NET Core) , 310 байт
Без LINQ. Использует System.Collections.Generic только для форматирования вывода после возврата функции. Вещь глупо огромна. Ждем в гольф!
Попробуйте онлайн!
источник
Python 2 , 198 байт
Попробуйте онлайн!
Разработан независимо от ответа TFeld, имеет некоторые отличия.
источник
Древесный уголь , 118 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Я также потратил несколько байтов на более красивое форматирование. Объяснение:
JavaScript имеет удобное свойство
a[i]>a[i+1]
false, еслиi
это последний элемент массива. Чтобы подражать этому в Charcoal, я вычисляю anan
, бросая,9.e999
чтобы плавать и затем вычитая это из себя. (Древесный уголь не поддерживает экспоненциальные константы с плавающей точкой.) Затем яnan
добавляю исходный массив справа и также добавляю дополнительную строку, содержащую толькоnan
. (Циклическая индексация угля означает, что мне нужен только один элемент в этой строке.)Цикл для каждого элемента в массиве. Это должно быть более чем достаточно циклов, чтобы выполнить работу, так как я включаю все дополнительные
nan
S тоже.Цикл по каждому индексу строки и получить строку по этому индексу. (Древесный уголь может быть как с выражением, но не с командой.) Это включает в себя пустую строку, но это не проблема, потому что все сравнения не удастся.
Цикл по каждому индексу столбца и получить значение по этому индексу. Опять же, это зациклится на фиктивных значениях, но сравнение снова не удастся.
Также получите значения справа и снизу.
Если ячейка больше значения, указанного ниже, и неверно, что значение ниже больше значения справа, то поменяйте местами ячейку со значением ниже.
В противном случае, если ячейка больше значения справа, поменяйте их местами.
Удалите
nan
значения и отформатируйте массив для неявного вывода.источник
Котлин , 325 байт
Попробуйте онлайн!
источник