Алгоритм сортировки выборки Python

#python #algorithm #list #sorting

#python #алгоритм #Список #сортировка

Вопрос:

Работаем над реализацией этого алгоритма с использованием Python. Я думал, что моя логика в порядке, но, видимо, не так, как жалуется Python. Цикл while вызывает проблемы. Если я удалю это, он будет работать так, как ожидалось, но, очевидно, не сортирует весь список. Мой мыслительный процесс -> Использовать линейный поиск, чтобы найти наименьшее число -> Добавить это новое число в список -> Удалить это число из текущего списка -> Снова перебрать тот же список (но с удалением наименьшего числа) -> Повторять процесс, пока мы не пройдем весь список «x» количество раз. «x» равно длине списка. Проблема, с которой, я думаю, я сталкиваюсь, заключается в том, что список никогда не обновляется каждый раз, когда я выполняю цикл for? Я продолжаю получать ошибку Line 21: ValueError: list.index(x): x not in list . Даже если «x» находится в списке. Есть идеи относительно того, что я делаю неправильно?

 """
Selection sort algorithm.
"""

import random
ls = []
max_number = 10
while len(ls) < max_number:
    ls.append(random.randint(1,101))
print ls   

def selection_sort(items_to_sort):
    smallest_number = items_to_sort[0]
    current_number = 0
    sorted_items = []
    item_len = len(items_to_sort)
    while item_len > 0:
        for item in items_to_sort[:]:
            if item < smallest_number:
                smallest_number = item
        items_to_sort.pop(items_to_sort.index(smallest_number))    
        sorted_items.append(smallest_number)   
        item_len -= 1    
    return sorted_items
print selection_sort(ls)
  

Ответ №1:

Похоже, вы не повторно инициализируете smallest_number переменную, поэтому после первого выполнения вашего while цикла вы ищете значение, меньшее, чем предыдущее значение, которое вы только pop что отредактировали из списка.

Когда вы не находите значение, меньшее, чем предыдущее наименьшее значение, которого больше нет в списке, вы пытаетесь выполнить pop то smallest_number же самое, что и в предыдущей итерации while цикла. Однако этого значения больше нет в items_to_sort списке, поэтому вы получаете ValueError

Попробуйте переместить строку smallest_number = items_to_sort[0] , чтобы она была первой строкой, выполняемой на каждой итерации вашего while цикла.

Комментарии:

1. да, вы правы, если он не инициализирует smallst_number повторно, он никогда не сможет найти меньшее число, которое меньше последнего наименьшего числа…

Ответ №2:

После каждого цикла while вы должны назначить items_to_sort[0] smallest_number

 current_number = 0
sorted_items = []
item_len = len(items_to_sort)
while item_len > 0:
    smallest_number = items_to_sort[0]
    for item in items_to_sort[:]:
        if item < smallest_number:
            smallest_number = item
    index=items_to_sort.index(smallest_number)
    items_to_sort.pop(index)
    print(items_to_sort)
    sorted_items.append(smallest_number)
    item_len -= 1
return sorted_items