Создайте функцию или программу, которая принимает два входа:
- Список целых чисел, которые должны быть отсортированы (менее 20 элементов)
- Целое положительное число,
N
указывающее, сколько сравнений следует выполнить
Функция должна остановиться и вывести результирующий список целых чисел после N
сравнений. Если список полностью отсортирован перед выполнением N
сравнения, то отсортированный список должен быть выведен.
Bubble рода алгоритм хорошо известен, и я предполагаю , что большинство людей знают об этом. Следующий псевдокод и анимация (обе из связанной статьи в Википедии) должны предоставить необходимые детали:
procedure bubbleSort( A : list of sortable items )
n = length(A)
repeat
swapped = false
for i = 1 to n-1 inclusive do
/* if this pair is out of order */
if A[i-1] > A[i] then
/* swap them and remember something changed */
swap( A[i-1], A[i] )
swapped = true
end if
end for
until not swapped
end procedure
Анимация ниже показывает прогресс:
Пример (взятый непосредственно из связанной статьи Википедии) показывает шаги при сортировке списка ( 5 1 4 2 8 )
:
Первый проход
1: ( 5 1 4 2 8 ) -> ( 1 5 4 2 8 ) // Here, algorithm compares the first two elements,
// and swaps since 5 > 1.
2: ( 1 5 4 2 8 ) -> ( 1 4 5 2 8 ) // Swap since 5 > 4
3: ( 1 4 5 2 8 ) -> ( 1 4 2 5 8 ) // Swap since 5 > 2
4: ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 ) // Now, since these elements are already in order
// (8 > 5), algorithm does not swap them.
Второй проход
5: ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 )
6: ( 1 4 2 5 8 ) -> ( 1 2 4 5 8 ) // Swap since 4 > 2
7: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
8: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
Теперь массив уже отсортирован, но алгоритм не знает, завершен ли он. Алгоритму нужен один полный проход без какого-либо обмена, чтобы знать, что он отсортирован.
Третий проход
9: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
10:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
11:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
12:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
Тестовые случаи:
Формат: Number of comparisons (N): List after N comparisons
Input list:
5 1 4 2 8
Test cases:
1: 1 5 4 2 8
2: 1 4 5 2 8
3: 1 4 2 5 8
4: 1 4 2 5 8
5: 1 4 2 5 8
6: 1 2 4 5 8
10: 1 2 4 5 8
14: 1 2 4 5 8
Input list:
0: 15 18 -6 18 9 -7 -1 7 19 19 -5 20 19 5 15 -5 3 18 14 19
Test cases:
1: 15 18 -6 18 9 -7 -1 7 19 19 -5 20 19 5 15 -5 3 18 14 19
21: -6 15 18 9 -7 -1 7 18 19 -5 19 19 5 15 -5 3 18 14 19 20
41: -6 9 -7 15 -1 7 18 18 -5 19 19 5 15 -5 3 18 14 19 19 20
60: -6 -7 -1 9 7 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
61: -6 -7 -1 7 9 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
81: -7 -6 -1 7 9 15 -5 18 18 5 15 -5 3 18 14 19 19 19 19 20
119: -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
120: -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
121: -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
122: -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
123: -7 -6 -1 -5 7 9 5 15 -5 15 3 18 14 18 18 19 19 19 19 20
201: -7 -6 -5 -1 -5 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20
221: -7 -6 -5 -5 -1 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20
- Да, встроенные алгоритмы Bubble sort разрешены.
- Нет, вы не можете принимать только положительные или уникальные целые числа.
- Сортировка должна быть в порядке, описанном выше. Вы не можете начать с конца списка
Ответы:
Желе , 25 байт
На основании моего ответа в J.
Попробуйте онлайн!
Проверьте количество сравнений.
объяснение
Вспомогательная ссылка изменяет список по индексу
[i-1, i]
, сортируя его, что дает тот же результат, что и сравнение с сортировкой пузырьков.источник
JavaScript (ES6),
10282808680 байтИсправлена ошибка и 1 байт сохранен благодаря @ edc65
Рекурсия
может и не быть, безусловно, нелучший подход, но сейчас я придерживаюсь цикла.Попробуйте это:
Показать фрагмент кода
источник
f=(a,m,n=0,_,b=a[n+1])=>b+.5?m?f(a,m-1,n+1,a[n]>b?a[a[n+1]=a[n],n]=b:0):a:f(a,m,0)
.,0
1/b
вместо того,b+.5
чтобы проверитьundefined
Haskell,
838281 байтПример использования:
[5,1,4,2,8] ! 5
->[1,4,2,5,8]
.В функции
%
y
отслеживает элементы, посещенные до сих пор во время текущего прохода,x
которые еще предстоит изучить.a
иb
следующие два, то есть кандидаты на обмен. Если мы достигаем конца списка, мы начнем с самого начала:y%x = []%(y++x)
. Все шаги хранятся в списке, где основная функция выбираетn
элемент th.Изменить: предыдущие версии не работали для списков из одного элемента, к счастью, новая версия еще короче.
источник
f=
перед второй строкой ответ, затем добавьте третью строку в программу, содержащуюmain=print(f [5,1,4,2,8] 5)
. Это должно сделать его работоспособным.Python 3,
7774 байта-3 байта благодаря @Maltysen (init
j
в объявлении)Тестовые случаи в Ideone
Использует
sorted
каждую операцию сравнения и обмена, но выполняет пузырьковую сортировку.Устанавливает
j=0
(левый индекс), затем выполняетn
сравнение и перестановку смежных элементов списка, сбрасываяj
их,0
когда это окно выходит за пределы.В этой точке
j*=j<len(l)-1
воля будет умножатьсяj
наFalse
(т.е.0
), тогда как каждый раз она будет умножатьсяj
наTrue
(то есть1
).(Это все еще будет работать для пустого списка тоже.)
источник
j
, вы можете использовать%
eval
MATLAB из-за встроенных заданий.PowerShell v2 +,
135129 байтТак. Много. Доллары.
( Сохраненный шесть байтов, понимая , что эта задача не включает в себя «бесплатно» оптимизации пропуска последнего элемента (ов) на каждом проходе , так что гарантировала отсортированный, и вместо этого проходит через полный проход каждый раз. Это переместил
$a.count
вfor
зациклите и исключите$z
переменную. )Прямо пузырьковая сортировка, с одним изящным пятном, делая обмен за один шаг -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]
Логика выхода обрабатывается через
if(!--$n){$a;exit}
Тестовые случаи
(Массив здесь показан как разделенный пробелами, потому что разделителем выходных полей по умолчанию для строкового массива является пробел. Стрификация происходит потому, что мы объединяем метки
"$_ -> "
.)источник
R
132131112136 байтПрограмма получает входные данные следующим образом: сначала
N
сам вектор. Например, если вы хотитеv = [5 1 4 2 8]
иn = 1
, вход, который входит вscan
это1 5 1 4 2 8
. Поэтому для того , чтобы запустить эту программу, вы запустить первую линию , кормить число один за другим в консоли , а затем запустить остальное (это РЕПЛ ответ).Тогда следующий код делает свое дело:
Тестовое задание:
Обновление: игра в гольф 1 байт благодаря Vlo .
источник
Pyth,
3432 байтаПеревод ответа Джонатана Аллана на Python.
Попробуй это здесь!
источник
JavaScript (ES6),
828079 байтОсновано на оригинальном ответе @ ETHproduction. Изменить: Сохранено 2 байта благодаря @JonathanAllan. Сохранено 1 байт благодаря @ edc65.
источник
J ,
6260 байтЭто глагол, который принимает два аргумента: количество сравнений в LHS и список целых чисел в RHS. Сначала он проверяет, больше ли длина списка, чем один. Если это не так, он возвращает список без изменений, в противном случае он работает с ним, выполняя указанное количество сравнений перед возвратом результата.
использование
В первом тестовом примере дополнительные команды используются для форматирования нескольких входов / выходов. Второй тестовый пример показан как один вход / выход.
объяснение
Трудно написать краткий код на J, который использует изменчивость, поэтому вместо этого я преобразую проблему в сокращение списка на множестве признаков. Я думаю, что этот код грязный, поэтому я рассмотрю каждую фразу вместо каждого примитива. Первая часть захватывает длину списка и создает диапазон. Затем оперируйте каждым инфиксом размера 2, чтобы эмулировать один проход сравнений.
Это стартовые показатели каждого сравнения. Если выполняется 7 сравнений, измените их, чтобы получить желаемую сумму. J разбирает справа налево, поэтому его уменьшается справа налево, как сгиб справа-налево. Добавьте начальный список и переверните его.
В качестве альтернативы, диапазон [0, 7) может быть установлен, и каждое значение принимается по модулю длины списка минус 1, чтобы создать тот же диапазон.
Последняя часть - это глагол, который берет список в RHS и индекс в LHS, который отмечает начальный индекс сравнения. Выберите два элемента, начиная с этого индекса, отсортируйте их и вставьте обратно в список и верните его.
источник
Matlab,
9391 байтСохраняет 11 байтов, опуская
if l(i)>l(i+1);l(i:i+1)=l([i+1,i])
, и вместо этого просто сортирует два элемента каждый раз. Работает для списков длины 1. Может сохранить один или два байта, используяm--
оператор Octave , но это не так много.Сохраняя еще два байта путем установки
n=numel(l)-1;
, потому что тогда я могу просто сделатьwhile n
вместоwhile n>1
, аi=mod(i,n)+1
вместоi=mod(i,n-1)+1
.Для справки, этот ответ был написан спустя много часов после создания проблемы.
источник
Groovy (101 байт)
РЕДАКТИРОВАТЬ: Мне не нужно было писать свое собственное закрытие подкачки, в Groovy это было встроено.
Попробуйте это здесь: https://groovyconsole.appspot.com/script/5104724189642752
Пример выходной трассировки:
Старая реализация (122 байта)
Попробуйте это здесь: https://groovyconsole.appspot.com/script/6316871066320896
источник
php,
148145 байтЯ не очень доволен структурой цикла, но мне нравится переключатель списка, и он работает, поэтому я все равно публикую его. php7.1 позволит мне сохранить как минимум 4 байта.
С более хорошим форматированием:
Изменить: Йорг Хюльсерманн напомнил мне присоединиться, а не взорваться.
примечание: должен быть в файле с именем файла из одного символа.
источник
Рубин,
5250 байтПодожди ... нет Руби?
источник