Соревнование
Это довольно просто, сортируйте список чисел.
Детали
Вы должны отсортировать список чисел в порядке возрастания, без использования каких-либо встроенных функций сортировки / библиотек / и т. Д. (Например, list.sort()
в Python).
Ввод / вывод может быть выполнен любым способом, который вы выберете, при условии, что он удобочитаем.
Стандартные лазейки запрещены как всегда.
Самый короткий код в байтах побеждает.
Вы должны объяснить / перечислить, какой метод сортировки вы использовали (Bubble, Insertion, Selection и т. Д.)
На входе не будет дубликатов.
Пример ввода / вывода
Входные данные: 99,-2,53,4,67,55,23,43,88,-22,36,45
Выход: -22,-2,4,23,36,43,45,53,55,67,88,99
Примечание: почти прямая противоположность Сортировать список номеров
[7 2 4 1] -> [4 2 3 1]
, Кроме того, список CSV может быть в скобках? Кроме того, определенный формат ввода очень подходит для некоторых языков и плохо подходит для других. Это делает анализ входных данных большой частью для некоторых представлений и ненужным для других.Ответы:
05AB1E , 2 байта
Код:
Тот же алгоритм, что и у желе . Вычисляет все перестановки ввода и высвечивает наименьшую.
Попробуйте онлайн!
Более эффективный метод:
Выполняет выбор сортировки . Использует кодировку CP-1252 .
Попробуйте онлайн!
источник
Желе, 3 байта
Это генерирует все перестановки входного списка, затем выбирает лексографически наименьшую перестановку. Очень эффективный
Кредиты @Adnan, который имел ту же идею независимо друг от друга.
Попробуйте онлайн!
Желе, 4 байта
Это строит диапазон от минимума списка до максимума списка, а затем отбрасывает элементы диапазона, которых нет в исходном списке. Технически это сортировка ведра с очень маленькими ведрами. Я не знаю имени для этого конкретного варианта.
Попробуйте онлайн!
Как это работает
источник
Python,
4645 байтПростой выбор сортировки.
источник
l[:]
может быть1*l
Брахилог ,
127 байтЭто использует сортировку перестановок, которая, очевидно, ужасна, но эй, она короче, чем Pyth!
объяснение
источник
Haskell, 38 байт
Двоичная функция
%
вставляет новый элементh
в отсортированный списокt
, разбивая егоt
на префиксa
элементов<h
и суффиксb
элементов>h
, и вставляетh
между ними.Затем операция
foldr(%)[]
создает отсортированный список из пустого путем многократной вставки элементов из списка ввода.Это на один байт короче, чем прямая рекурсивная реализация
Еще одна стратегия на 41 байт:
источник
%
внутренним циклом вставки иfoldr
его применением в качестве внешнего цикла.JavaScript (ES6), 51 байт
Каждый цикл находит наименьшее число, которое до сих пор не найдено.
источник
[1,2,3,4,5,4,3,2,1]
производит[1, 2, 3, 4, 5, Infinity, Infinity, Infinity, Infinity]
Python 2, 34 байта
Принимает ввод как набор, печатая его элементы в возрастающем порядке, заканчивая ошибкой.
Чистое завершение может быть сделано в 41 байте:
или
Входные данные могут быть представлены в виде списка для 39 байтов или 38 байтов в Python 3.5:
источник
m=min(s)
/s - (m)
в качестве внутреннего цикла для поиска и удаления минимума из несортированных элементов и рекурсии в качестве внешнего.Haskell,
424138 байтПеребирает все целые числа (64-битные на моем компьютере) и сохраняет те, которые есть
u
. Конечно, это не заканчивается в разумные сроки.Предыдущая версия,
[minimum u..maximum u]
которая прошла через ту же наихудшую версию, работает.Редактировать: @xnor сохранил байт. Благодарность!
источник
filter
короче:f u=filter(`elem`u)[minimum u..maximum u]
[minimum u..]
работает по причинам типа?f [1,3,0]
, элементов по умолчанию для типа,Integer
который является несвязанным, поэтому..
никогда не заканчивается. Если вам нужно назвать это как-f ([1, 3, 0]::[Int])
то, я думаю, аннотация типа должна быть включена в число байтов.Oracle SQL 11.2, 205 байт
Un-golfed
Что касается метода сортировки, я понятия не имею,
ORDER BY
удостоверился, что забыл их.источник
машинный код x86-16 (BubbleSort int8_t),
2019 байтмашинный код x86-64 / 32 (JumpDownSort)
2119 байтChangelog:
Спасибо @ ped7g за идею
lodsb
/cmp [si],al
и соединили это с увеличением / сбросом указателя, на который я смотрел. Не нужноal
/ah
позволяет нам использовать почти тот же код для больших целых чисел.Новый (но связанный) алгоритм, много изменений реализации: Bubbly SelectionSort допускает меньшую реализацию x86-64 для байтов или слов; безубыточность на x86-16 (байты или слова). Также избегает ошибки на size = 1, которая есть у моего BubbleSort. Увидеть ниже.
Оказывается, что моя Bubbly Selection Sort с перестановками каждый раз, когда вы находите новый мин, уже является известным алгоритмом JumpDown Sort. Это упоминается в Bubble Sort: Археологический Алгоритмический Анализ (то есть, как Bubble Sort стал популярным, несмотря на сосание).
Сортирует 8-битные целые числа со знаком на месте . (Без знака имеет тот же размер кода, просто изменить
jge
кjae
). Дубликаты не проблема. Мы меняем 16-битное вращение на 8 (с назначением памяти).Bubble Sort отстой для производительности , но я читал, что это один из самых маленьких для реализации в машинном коде. Это особенно актуально, когда есть специальные приемы для замены смежных элементов. Это почти единственное его преимущество, но иногда (в реальных встроенных системах) этого достаточно, чтобы использовать его для очень коротких списков.
Я пропустил досрочное прекращение ни в коем случае . Я использовал «оптимизированный» цикл BubbleSort из Википедии, который позволяет избежать просмотра последних
n − 1
элементов при запуске в-йn
раз, поэтому счетчик внешнего цикла является верхней границей для внутреннего цикла.Листинг NASM (
nasm -l /dev/stdout
) или простой источникПуш / поп
cx
вокруг внутреннего цикла означает, что он работает сcx
= external_cx до 0.Обратите внимание, что
rol r/m16, imm8
это не инструкция 8086, она была добавлена позже (186 или 286), но это не код 8086, а 16-битный x86. Если SSE4.1phminposuw
поможет, я бы использовал его.32-разрядная версия этого (все еще работает с 8-разрядными целыми числами, но с 32-разрядными указателями / счетчиками) составляет 20 байт (префикс размера операнда включен
rol word [esi-1], 8
)Ошибка: size = 1 рассматривается как size = 65536, потому что ничто не мешает нам войти во внешнюю do / while с cx = 0. (Вы обычно используете
jcxz
для этого.) Но, к счастью, 19-байтовая сортировка JumpDown занимает 19 байтов и не имеет этой проблемы.Оригинальная 20-байтовая версия x86-16 (без идеи Ped7g). Упущено для экономии места, см. Историю редактирования для него с описанием.
Спектакль
Частично перекрывающееся сохранение / перезагрузка (при повороте места назначения памяти) приводит к остановке пересылки хранилища на современных процессорах x86 (кроме Atom в порядке). Когда высокое значение пузырится вверх, эта дополнительная задержка является частью цепочки зависимостей, переносимых циклом. Хранить / перезагружать в первую очередь отстой (например, 5-тактная задержка пересылки при хранении в Haswell), но остановка пересылки доводит ее до 13 циклов. Внеочередное исполнение будет трудно скрыть это.
См. Также: Переполнение стека: пузырьковая сортировка для сортировки строки для версии с аналогичной реализацией, но с ранним выходом, когда не требуется перестановок. Он использует
xchg al, ah
/mov [si], ax
для перестановки, которая на 1 байт длиннее и вызывает остановку частичного регистра на некоторых процессорах. (Но это может все же быть лучше, чем memory-dst rotate, который должен снова загрузить значение). Мой комментарий там есть некоторые предложения ...x86-64 / x86-32 JumpDown Sort, 19 байт (сортирует int32_t)
Вызывается из C с использованием соглашения о вызовах System V x86-64 как
int bubblyselectionsort_int32(int dummy, int *array, int dummy, unsigned long size);
(возвращаемое значение = max (array [])).Это https://en.wikipedia.org/wiki/Selection_sort , но вместо запоминания позиции элемента min, поменяйте местами текущий кандидат в массив . Как только вы нашли min (unsorted_region), сохраните его в конце отсортированной области, как в обычной сортировке выбора. Это увеличивает отсортированный регион на единицу. (В коде
rsi
указывает на один конец конца отсортированного региона;lodsd
он перемещается вперед иmov [rsi-4], eax
сохраняет мин. Обратно в него.)Название «Прыжок вниз» используется в Bubble Sort: археологический алгоритмический анализ . Я полагаю, что мой вид - это тип Jump Up, потому что высокие элементы прыгают вверх, оставляя отсортированным нижний, а не конец.
Такая схема обмена приводит к тому, что несортированная часть массива заканчивается в основном в обратном порядке, что впоследствии приводит к множеству перестановок. (Потому что вы начинаете с большого кандидата и продолжаете видеть все более и более низкого кандидата, поэтому вы продолжаете менять местами.) Я назвал его «пузырьковым», даже если он перемещает элементы в другом направлении. То, как он перемещает элементы, также немного похоже на обратную вставку-сортировку. Чтобы посмотреть его в действии, используйте GDB
display (int[12])buf
, установите точку останова на внутреннейloop
инструкции и используйтеc
(продолжить). Нажмите возврат, чтобы повторить. (Команда «display» заставляет GDB печатать состояние целого массива каждый раз, когда мы достигаем точки останова).xchg
У mem есть неявныйlock
префикс, который делает это очень медленным. Вероятно, примерно на порядок медленнее, чем эффективный обмен загрузкой / хранением;xchg m,r
это одна пропускная способность на 23c на Skylake, но загрузка / сохранение / перемещение с регистром tmp для эффективного обмена (reg, mem) может сдвигать один элемент за такт. Это может быть худшее соотношение на процессоре AMD, гдеloop
инструкция быстрая и не будет узким местом внутреннего цикла, но пропуски ветвей все еще будут большим узким местом, потому что перестановки являются общими (и становятся более распространенными, когда несортированная область становится меньше ).Одинаковый размер код
int8_t
: использованиеlodsb
/scasb
,AL
и изменить[rsi/rdi-4]
к-1
. Тот же машинный код работает в 32-битном режиме для 8/32-битных элементов. 16-битный режим для 8/16-битных элементов необходимо перестроить с измененными смещениями (а в 16-битных режимах адресации используется другое кодирование). Но все же 19 байтов для всех.Он избегает начального
dec ecx
, сравнивая с элементом, который он только что загрузил, прежде чем двигаться дальше. На последней итерации внешнего цикла он загружает последний элемент, проверяет, меньше ли он самого себя, а затем выполняется. Это позволяет ему работать с size = 1, где мой BubbleSort не работает (обрабатывает его как size = 65536).Я проверил эту версию (в GDB) с помощью этого абонента: попробуйте онлайн! , Вы можете запустить его на TIO, но, конечно, нет отладчика или печати. Тем не менее, тот,
_start
который вызывает его, завершается с exit-status = наибольшим элементом = 99, так что вы можете видеть, что он работает.источник
cx
и использоватьloop
для обоих? Может быть, цикл в обратном направлении, от начала до конца массива, чтобы мы посчитали индекс до нуля? (И увеличивать,bx
потому что отсортированная часть находится в конце, к которому вы обращаетесь).sub si, cx
как часть внешнего цикла использование указателя вместо индексации, но я не думал оlodsb
/cmp [si], al
. Я думал о том,lodsw
/dec si
илиlodsb
/xchg al,ah
до сих пор настроен наcmp ah,al
cld
, или я думаю, мы могли бы сделать это частью соглашения о вызовах. AFAIK,DF
очистка не является стандартной частью 16-битных соглашений о вызовах, только 32/64. Или вы просто не можете предположить это в загрузчике? Но с пользовательским соглашением о вызовах регистров это такой же фрагмент кода, как и функция, поэтому, конечно, почему бы не потребовать DF = 0. (И если мы хотим, ES = DS, чтобы мы моглиscasb
вместо этого,lodsb
если это более удобно.)C, 72 байта
BubbleSort. Первый аргумент - это указатель на массив, второй аргумент - это длина массива. Работает с gcc.
источник
MATL ,
1110 байтКрайне неэффективный анализ всех перестановок ввода.
Попробуйте онлайн!
объяснение
источник
Рубин, 40 байт
Выбор сортировки. Анонимная функция; принимает список в качестве аргумента.
источник
Python, 120 байт
Это, вероятно, не самый короткий ответ, но я чувствую, что этот алгоритм принадлежит здесь. вызовите список целых чисел, они будут распечатаны в stdout отсортированным способом. Я не попробовал бы это с слишком большими числами все же.
источник
MIPS, 68 байт
Я недавно написал простую неоптимизированную реализацию сортировки пузырьков. Счетчик байтов начинается
loop
и заканчивается вli $v0, 10
предположении, что адрес списка и длина списка уже находятся в памяти.Теперь я жду, когда меня вырвут из воды с x86 ...
источник
swapped=true
раннюю проверку и вести обратный отсчет в зависимости от размера массива. Смотрите мою 20-байтовую версию x86-16, которая сортирует 8-битное целое число . Я мог бы сделать нормальную 32- или 64-разрядную версию x86, которая в какой-то момент сортирует 32-разрядные целые числа, но 8-разрядные целые числа в 16-разрядном режиме - это приятное место для x86.Awk, 66 байт
Массивы в awk похожи на словари, а не на массивы Си. Индексы могут быть несмежными, и они растут (и создаются) по мере необходимости. Итак, мы создаем массив
a
для ввода, где каждая строка является ключом. И мы сохраняем минимальное и максимальное значения. Затем мы выполняем цикл от минимума до максимума и печатаем все ключи, которые существуют вa
.b
это просто, чтобы избежать повторного использования$0
.источник
Python 3,
916247 байтБлагодаря wnnmaw и Seeq за помощь в игре в гольф.
Аргумент
z
должен быть списком. Это вариант выбора сортировки.Я не уверен, как
min
складывается противbuilt-in sorting functions
, так как я не уверен, как реализует Pythonmin
. Надеюсь, это решение все еще в порядке. Любые предложения по игре в гольф в комментариях или в чате PPCG приветствуются.источник
def f(z):\nwhile z:m=min(z);z.remove(m);yield m
MATL , 11 байт
Попробуйте онлайн!
Это сортируется по следующей процедуре, которая является O ( n 2 ):
MATL основан на стеке. Массив с остальными значениями хранится в верхней части стека. Удаленные значения приведены ниже по порядку. В конце программы все эти значения отображаются. Массив вверху также будет отображаться, но, поскольку он пуст, он не отображается.
источник
Pyth -
15131110 байтДва байта сохранены благодаря @Jakube.
Bogosort.
Попробуйте онлайн здесь .
Мне не нужно,
h
потому что мы гарантируем, что нет дубликатов.источник
Серьезно, 6 байт
Попробуйте онлайн!
Это делает то же самое, что и многие другие ответы: генерировать все перестановки, выбирать минимум. Я забыл, что это сработает, пока я работаю над приведенным ниже решением.
Объяснение:
Серьезно, 25 байт (не конкурирующих)
Это было бы конкурентоспособно, если бы не ошибка в команде shuffle, которую я только что исправил.
Попробуйте онлайн! Это реализует лучший алгоритм сортировки: Bogosort !
Объяснение:
источник
MATL,
1716 байтСохраненный один байт, создающий нулевой массив благодаря @LuisMendo
Ковш сортировать. Не пытайтесь делать это с диапазоном, превышающим 2 31 -1.
Попробуйте онлайн!
объяснение
TIL:
[]
и увеличивая его, как в MATLAB.(
для индексации назначенияM
автоматическим буфером обменаНовый день, новый ТИЛ:
vertcat
волшебным образом создает пустой массив, когда в стеке нечего объединятьисточник
[]
может быть заменен наv
. Это связано с тем, что по умолчанию количество входовv
равно количеству элементов в стекеvertcat(STACK{:})
Юлия,
2827 байтПопробуйте онлайн!
источник
R, 68 байт
Принимает ввод
i
и вывод,o
который является отсортированным списком.Объяснение:
Отказ от перестановок означает, что он может сортировать большие списки относительно быстро. «Хитрость» заключается в том, что вычитание наименьшего значения из входных данных оставляет один 0, который определяет как наименьшее значение, так и позицию наименьшего значения.
источник
Java 8,
11292 байтаВот еще один выбор выбора. Входные данные представляют собой
List t
целые числа, а отсортированный вывод выводится на стандартный вывод.Обновить
источник
t
, что делает ее фрагментом; мы требуем, чтобы представления были полными программами или функциями, которые используют наши форматы ввода / вывода по умолчанию . Мы также требуем, чтобы импорт учитывал количество байтов. Дайте знать, если у вас появятся вопросы!Сетчатка, 95
Модифицированная пузырьковая сортировка. Я подозреваю, что есть намного лучшие способы сделать это, даже без встроенной сортировки сетчатки.
n
в качестве цифры; бросьте-
знаки.1
цифрой; добавьте1
к каждому, чтобы ноль был представлен1
.Попробуйте онлайн.
источник
Рубин, 22 байта
Быстрая перестановка рода. Работает в O (n!) Пространстве и времени.
источник
Clojure,
7335 байтБогосорт :)
Более ранняя версия:
Сокращается до отсортированного списка
r
путем разбиения его на части «меньше, чем я» и «больше, чем я». Я думаю, это сортировка вставки .источник
recur
на анонимную функцию. Тоже не знал оshuffle
.Рубин,
2624 байтаСортировка выбора, похожая на ответ Value Ink, но использующая другой подход для большей игры в гольф.
В соответствии со спецификацией: «Ввод / вывод может быть выполнен любым способом, который вы выбираете, при условии, что он удобочитаем». Я думаю, что это соответствует описанию, вывод представляет собой массив массивов с одним элементом.
пример:
источник
Java 7,
106104 байтаВот хорошая оле пузырьковая сортировка. Параметр функции изменен на месте, поэтому мне не нужно ничего возвращать. Все еще пытаюсь выжать из этого несколько байтов, чтобы я смог превзойти Java-лямбду, которую кто-то опубликовал.
-1 байт, спасибо Geobits за указание на то, что обычная замена бьет xor'ing
-1 байт благодаря Leaky Nun за указание, что я могу переместить все объявления int в цикл for
Попробуйте онлайн!
источник
Рубин, 22 байта
Создает массив из диапазона между минимальным и максимальным элементами входного массива. Возвращает пересечение между двумя массивами.
источник