Скажем, у меня есть список типа [3, 0, 4, 2, 1]
, и я использую сортировку выбора, чтобы отсортировать ее, я мог бы визуализировать это так:
3,0,4,2,1
|-|
0,3,4,2,1
|-----|
0,1,4,2,3
|-|
0,1,2,4,3
|-|
0,1,2,3,4
Эта задача о визуализации сортировки, как это.
вход
Ваш ввод будет список положительных чисел, в любом формате, который вам нравится.
задача
Ваше представление должно отсортировать входной список, меняя местами только два элемента, и при каждом обмене представление должно отображать список и символ под каждым из заменяемых элементов. Если число, которое было поменяно местами, имеет более одной цифры, символ может находиться в любом месте под ним. В конце представления должно отображаться отсортированный список.
Другие правила
- Сортировка должна использовать меньше свопов, чем n 4 , где n - длина списка.
- Сортировка не должна быть детерминированной.
- Символы под поменяемыми местами могут быть любыми символами, кроме пробела.
n^4
? Вы немного щедры здесь.0
(пожалуйста, исправьте только пример, чтобы не аннулировать ответы, которые не могут обработать 0)Ответы:
Perl, 62 байта
Включает +3 для
-p
Введите ввод в виде одной строки чисел на STDIN:
Неоднократно менял местами первую инверсию. Сложность свопа есть
O(n^2)
, сложность времени естьO(n^3)
. Использует числа, поменяемые местами как метки:visisort.pl
:Программа также поддерживает отрицательные значения и числа с плавающей запятой
Если вы настаиваете на соединительном символе, код становится 66 байтами:
Но теперь он больше не поддерживает отрицательные числа и 0 (но в любом случае программа должна поддерживать только положительные целые числа. В
0
данном примере это ошибка)источник
The characters under the swapped can be any char except space.
вас не должно быть пробелов между_
под первой цифрой, что означает, что все символы между ними на самом деле будут пробелами). Поэтому я придерживаюсь своей интерпретации (если, конечно, ФП не согласен). Но только для того, чтобы вы были счастливы, я добавил версию без пробела :-)JavaScript (ES6), 158 байт
Пузырьковая сортировка. Образец вывода:
источник
-
под,,
и тогда две|
s всегда будут под соседними числами.PHP, 248 байт
Bubblesort скучные победы
PHP, 266 байт путь с array_slice и min
измененный вывод
I X
вместо*~~*
282 байта
Как это устроено
Ищет минимум в массиве и принимает его в первой позиции. Ищет минимум без первой позиции .... и т. Д. Если значение равно двойному, первое значение будет заменено
Пример вывода
источник
echo$t."\n";
вы можете использоватьecho"$t\n";
и сохранить байт.Haskell,
165164162 байтаЭто визуализирует выбор сортировки. Пример использования:
Как это устроено:
s % c
вспомогательная функция , которая делаетlength (show s) - 2
копию символаc
. Он используется для интервалов до того и другого|
, один раз сc == ' '
и один раз сc == '-'
.Основная функция
#
принимает список,p
который является отсортированной частью списка иx
которая еще не отсортирована. Сопоставление с образцом(h,t:s)<-span(/=minimum x)x
разбивает списокx
по минимальному элементу и привязываетh
к части до минимума,t
к самому минимуму иs
к части после минимума. Остальное форматирует две строки: 1) список в его текущем состоянии (p++x
) и 2)|----|
часть, за которой следует рекурсивный вызов#
сt
добавлениемp
и заголовкомh
вставки между хвостомh
иs
.PS: работает также с отрицательными числами и / или числами с плавающей запятой:
Редактировать: @BlackCap сохранил 2 байта. Благодарность!
источник
id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
Python 2, 267 байт
Работает с десятичными и отрицательными числами.
Пример:
источник
JavaScript (ES6), 147
155Использование n * n сравнивает, но (я считаю) минимальное количество перестановок. И позиции обмена более изменчивы по сравнению с типом скучных пузырьков.
Менее гольф и, надеюсь, более понятным
Тестовое задание
источник
Java 7,
256 241282 байтаСпасибо @Geobits и @Axelh за сохранение 15 байт
Ungolfed
выход
источник
out
, вам нужно поместить что-то вродеPrintStream out=System.out;
где-то в вашем коде.out
, вы должны использовать троичный вместо того,if/else
если вы собираетесь печатать на обеих ветвях. Нечто подобноеout.print(a>b?a:b);
вместоif(a>b)out.print(a);else out.print(b);
if(j==i|j==m)out.print(a[j]);out.print(" ");
или, что еще лучше, с помощью троичного символа,out.print((j==i|j==m?a[j]:" ")+" ");
а затем удалить цикл {}. PS: я использую статический импорт для экземпляра out, если это нормально;)System.
передout
s), и он пропускает2
и3
на двух последних линиях обмена.for(j=0;j<=m&i!=l-1;j++)
Желе , 36 байт
Попробуйте онлайн!
объяснение
Пример, показанный в ссылке TIO, является особенно сложным для этой программы;
;0
вблизи начала необходимо убедиться , что цикл заканчивается как раз в тот момент , когда вход становится отсортированный. Обычно это не требуется (потому что это закончится после еще одной итерации), но если последний обмен состоит из первых двух элементов (как показано здесь), еще одна итерация не произойдет и сделает невозможным завершение список последовательно. Таким образом, мы должны убедиться, что мы ничего не меняем на последней итерации цикла.источник