Это вопрос кода-гольфа.
вход
Список неотрицательных целых чисел в любом формате является наиболее удобным.
Выход
Один и тот же список в отсортированном порядке в любом удобном формате.
ограничение
- Ваш код должен выполняться за O (n log n) в худшем случае, когда
n
число входных чисел. Это означает, что рандомизированная быстрая сортировка отсутствует, например. Однако есть много других вариантов на выбор. - Не используйте сортировочную библиотеку / функцию / подобное. Также не используйте ничего, что выполняет большую часть работы по сортировке, как библиотека кучи. В принципе, что бы вы ни реализовывали, реализуйте это с нуля.
Вы можете определить функцию, если хотите, но затем, пожалуйста, покажите пример ее в действующей полной программе. Он должен работать успешно и быстро на всех тестовых примерах ниже.
Контрольные примеры
In: [9, 8, 3, 2, 4, 6, 5, 1, 7, 0]
Out:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In: [72, 59, 95, 68, 84]
Out:[59, 68, 72, 84, 95]
In: [2, 2, 1, 9, 3, 7, 4, 1, 6, 7]
Out:[1, 1, 2, 2, 3, 4, 6, 7, 7, 9]
In: [2397725, 1925225, 3304534, 7806949, 4487711, 8337622, 2276714, 3088926, 4274324, 667269]
Out:[667269,1925225, 2276714, 2397725,3088926, 3304534, 4274324, 4487711, 7806949, 8337622]
Ваши ответы
Пожалуйста, укажите алгоритм сортировки, который вы реализовали, и длину вашего решения в заголовке вашего ответа.
O (n log n) алгоритмы сортировки по времени
Существует много O (n log n) временных алгоритмов. Эта таблица содержит список некоторых из них.
intersect
автоматическая сортировка массива. Я полагаю, вы тоже хотите это исключить. Как насчетunique
(удалить дубликаты, отсортировать результат)?intersect
подпадает под "аналог", если он автоматически сортирует массив. Если вы удалите дубликаты, вы получите неправильный вывод.Ответы:
Хаскелл,
878089Это сортировка слиянием, реализованная снизу вверх. сначала мы упаковываем каждый элемент в его собственный список, а затем объединяем их два на два и снова объединяем их два на два, пока у нас не останется один список.
(%)
это функцияj
слияния пар слияния в списке списковr
слияния полный список списковs
является функцией сортировки.Использование: Запустите переводчик и введите
s [3,5,2,6,7]
.Изменить: способ, которым я слил вещи раньше, был неправильным порядком, поэтому, чтобы исправить это, мне нужно было еще 9 символов.
источник
main = print (s [5,3,6,8])
, которая установит main для печати результата сортировки.[]%s=s
, потому что, если первый элемент[]
,(x:a)
совпадение не удается, и последний случай переворачивает элементы, так что этоs%[]
успешно.JavaScript (ES6),
195193191189188186183182179174172 байтаЭто реализация heapsort. Я ожидаю, что кто-то предложит более короткую сортировку, но мне нравится эта: P
Обновление: R mergesort избит. Рубин до следующего: D
Тест (Firefox)
Показать фрагмент кода
источник
Python3, 132 байта
Простая сортировка. Много байтов было потрачено, чтобы убедиться, что это действительно выполняется в O (n log n), если только алгоритм , но не реализация должна быть O (n log n), это можно сократить:
Python3, 99 байт
Это не O (n log n), потому что
.pop(0)
это O (n), что делает функцию слияния O (n ^ 2). Но это довольно искусственно, так как это.pop(0)
легко могло быть O (1).источник
Юлия, 166 байт
Вызывается основная функция,
M
которая вызывает вспомогательную функциюm
. Он использует сортировку слиянием , которая имеет O ( n log n ) в качестве наихудшего варианта сложности.Пример использования:
Ungolfed:
источник
R, 181 байт, Mergesort
С отступом, с новыми строками:
Тестовые случаи:
источник
Scala, функция 243 байта (автономное приложение 315 байтов), Mergesort
Этот ответ предназначен для использования в качестве функции, но его можно расширить, чтобы он стал отдельным приложением.
Только для функции (243 байта):
Автономное приложение (315 байт):
Использование:
Пример ввода:
Выход:
Ограничения и соображения:
Attribution:
m()
функция), вдохновленная этим ответом: /codereview//a/21590/28856источник
Желе, 29 байт, сортировка слиянием
Как ответ на Python orlp, это использование
list.pop(0)
под капотом, которыйO(n)
, однако реализация формальноO(n log n)
.Попробуй это здесь.
объяснение
источник
.pop(0)
есть O (n), что делает функцию слияния O (n ^ 2). Но это довольно искусственно, так как это.pop(0)
легко могло быть O (1).Ḣ
реализован как.pop(0)
.Рубин, 167 байт
Алгоритм сортировки методом слияния по гольфу, который имеет наихудший O (n log n)
Проверьте это здесь!
Для проверки скопируйте и вставьте код в окно и добавьте
puts f[x]
внизу, где x - это массив с входными данными. (Убедитесь, что вы выбрали Ruby в качестве языка, конечно) Например,puts f[[2, 2, 1, 9, 3, 7, 4, 1, 6, 7]]
источник
Рубин, 297 байт
Сортировка слиянием. Полная программа, а не функция. Требуется два аргумента во время выполнения: входной файл и выходной файл, каждый с одним элементом в строке.
источник
$stdin.readlines
уже меньше байт , чемopen(ARGV[0]).readlines
, то же самое сputs
болееopen(ARGV[1],"w"){|f|f.puts
if $0==__FILE__
действительно не нужны в коде гольфа. Вы также можете заменить каждую;
из них новой строкой - это тот же счетчик байтов и (вероятно) удаляет горизонтальную прокрутку кода. Также я рекомендую проверить советы по игре в гольф в Ruby .