Я пишу программу на Python, которая реализует алгоритм сортировки выбором и сортирует элементы списка в порядке убывания.
Допустим, мой ввод l = [242, 18, 44, 201, 1111]
.
Моя логика такова:
l = [242, 18, 44, 201, 1111] # switch l[0] (242) and l[len(l)-1] (1111)
l = [1111, 18, 44, 201, 242] # switch l[1] (18) and l[len(l)-1] (242)
l = [1111, 242, 44, 201, 18] # switch l[2] (44) and l[len(l)-2] (201)
Результат будет [1111, 242, 201, 44, 18]
.
Итак, вот код, который я реализую на основе приведенной выше логики:
def selSort(l):
'''Sorts the list in descending order using a selection sort algorithm.
Params: l (list): unsorted list
Sorts: unsorted list in descending order
'''
start = len(l)-1
while start != 0:
for i in range(len(l)):
if l[i] < l[start]:
l[i], l[start] = l[start], l[i]
start -= 1
Похоже, я переоценил свою логику, потому что алгоритм выдает [1111, 18, 242, 201, 44]
.
После некоторой отладки я смог обнаружить, что после пары обходов l
правильно отсортирован, но цикл while все еще не соответствует условию завершения. Это означает, что между start
и i
будет нежелательное совпадение. Например, когда start = 3
и i = 4
, l[i] < l[start]
получается l = [1111, 242, 201, 18, 44]
. После дополнительного обхода мы пришли к неверному результату, который я показал выше.
Что было бы элегантным (я знаю, что сортировка выбора - не самый эффективный алгоритм) и Pythonic решением этой проблемы? Я пытаюсь добиться этого без использования каких-либо встроенных функций (за исключением len
и range
), методов или внешних библиотек (если это возможно).
Я проверил алгоритм сортировки выбором Python и Алгоритм сортировки выбором в Java публикуется здесь, на SO. Первый использует методы списка (которых я стараюсь избегать), и я недостаточно хорошо понимаю синтаксис Java, чтобы использовать последний.