Подумав, я пришел к выводу, что можно также выполнить сортировку на основе свопов, если вам разрешено использовать reduce
более одного раза. А именно:
from functools import reduce
arr = [17, 2, 3, 6, 1, 3, 1, 9, 5, 3]
def func(acc,x):
if not acc:
return [x]
if acc[-1]<x:
return acc+[x]
else:
return acc[:-1]+[x]+acc[-1:]
def my_sort(x):
moresorted = reduce(func,x,[])
print(moresorted)
if x==moresorted:
return moresorted
else:
return my_sort(moresorted)
print('arr:',arr)
arr_sorted = my_sort(arr)
print('arr sorted:',arr_sorted)
Выход:
arr: [17, 2, 3, 6, 1, 3, 1, 9, 5, 3]
[2, 3, 6, 1, 3, 1, 9, 5, 3, 17]
[2, 3, 1, 3, 1, 6, 5, 3, 9, 17]
[2, 1, 3, 1, 3, 5, 3, 6, 9, 17]
[1, 2, 1, 3, 3, 3, 5, 6, 9, 17]
[1, 1, 2, 3, 3, 3, 5, 6, 9, 17]
[1, 1, 2, 3, 3, 3, 5, 6, 9, 17]
arr sorted: [1, 1, 2, 3, 3, 3, 5, 6, 9, 17]
Я поместил print(moresorted)
внутри func
для образовательных целей, вы можете удалить его, если хотите.
Теперь объяснение: my_sort
- рекурсивная функция, с каждым прогоном ее список становится все более и более отсортированным. func
, который используется как функция в reduce
, добавляет новый элемент и затем меняет 2 последних элемента списка, если они не в порядке возрастания.
Это означает, что при каждом прогоне my_sort
число «путешествует» вправо до тех пор, пока не произойдет, где следующее число будет больше.
if not acc
требуется для запуска - обратите внимание, что третий аргумент reduce
равен []
, что означает, что во время первого выполнения func
в каждом reduce
первый аргумент для func равен []
, поэтому спрашиваете acc[-1]<x
? приведет к ошибке.