Почему этот метод сортировки не работает в Python? - PullRequest
0 голосов
/ 09 июня 2019

У меня есть этот код для сортировки списка без использования отсортированной функции в python. Результат противоположен ожидаемому (от наибольшего к наименьшему, а не от наименьшего к наибольшему)

Изменение <на a>, кажется, помогает, но я не уверен, почему это

lista=[2,1,5,1,3,6]

for i in range(len(lista)):
  for l in range(len(lista)):
    if i==l:
      continue
    if lista[l]<lista[i]:
      temp=lista[i]
      lista[i]=lista[l]
      lista[l]=temp


print(lista)

ожидаемый список вывода, который будет уменьшен до наибольшего, но получит противоположное, если я не поменяю знак <знак на>, но я не уверен, почему это так?

Ответы [ 2 ]

3 голосов
/ 09 июня 2019

Старайтесь писать на бумаге каждую итерацию вашего алгоритма:

i = 0: 2 1 5 1 3 6
i = 1: 1 2 5 1 3 6 
i = 2: 2 1 5 1 3 6

Ваша проблема в том, что внутренний цикл for l in range(len(lista)): начинается каждый раз с 0, но вместо этого вы должны начинать с позиции i.Когда вы заканчиваете внутренний цикл, вы увеличиваете i до 1, и все, что есть до i, уже отсортировано.Если внутренний цикл перезапускается с начала, как в этом случае, у вас будет 1, что меньше 2 (при i = 1), вы меняете его снова.

lista=[2,1,5,1,3,6]

for i in range(len(lista)):
   for l in range(i, len(lista)):
       if i==l:
           continue
       if lista[l]<lista[i]:
           temp=lista[i]
           lista[i]=lista[l]
           lista[l]=temp

Я рекомендую вам прочитать о сортировка вставок и сортировка выбора , чтобы лучше изучить этот алгоритм.

0 голосов
/ 09 июня 2019

Проблема в том, что второй цикл снова проходит через весь список. Вместо этого вы должны рассмотреть оставшиеся элементы:

lista = [2, 1, 5, 1, 3, 6]

for i in range(len(lista)):
    # change range to start at i
    for l in range(i, len(lista)):
        if i == l:
            continue
        if lista[l] < lista[i]:
            temp = lista[i]
            lista[i] = lista[l]
            lista[l] = temp

edit: Чтобы быть более конкретным, подумайте о том, что происходит на последней итерации внешнего цикла. lista[i] будет последним местом в списке, и вы меняете местами каждый раз, когда lista[l] меньше, поэтому в итоге у вас будет наименьшее число в качестве последнего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...