2016-10-04 4 views
0

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

""" 
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) 

ответ

2

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

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

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

+0

да у не в порядке, если он не повторно инициализировать smallst_number, он может не найти меньшее число, которое меньше, чем в прошлом мельчайший число ... – Acepcs

+0

Fantastic. Вы - Бог среди людей. Спасибо, сэр. – terratunaz

+0

Рад, что я мог бы помочь, если бы этот ответ помог вам, отметьте его как принятый. :) – ctj232

1

После каждого цикла в то время, вы должны назначить 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