2014-01-31 8 views
0

Я пытаюсь Spiff-моих навыков и думал, что я хотел бы попробовать написать свой собственный алгоритм немного сортировочный:Сортировка алгоритм не работает

import random 
from random import randint 

int_list = [] 
for i in range(10):  #Creates a 10-entry list of randon ints 
    int_list.append(random.randint(0,10)) 
print "Unsorted list:\t" + str(int_list) 

def sorter(int_list): 
    for i in range(len(int_list)-1): 
     while int_list[i] > int_list[i+1]: 
      temp = int_list[i] 
      int_list[i] = int_list[i+1] 
      int_list[i+1] = temp 
      continue 
     return int_list 

print "\"Sorted\" list:\t" + str(sorter(int_list)) 

Когда я запускаю этот скрипт он сортирует только первые два записи списка. Мое понимание continue состояло в том, что он продолжал бы проходить через мой цикл while, а оператор while был True.

+2

На самом деле, так как в конце в то время как контур, 'continue' ничего не делает. Вы можете (должны) удалить его без проблем. – iCodez

+0

Должно ли это быть в начале цикла или вообще нет? – Matt

+0

'continue' просто останавливает выполнение текущей итерации и запускает следующий. –

ответ

1

Ваш while фактически работает как if, выглядит, как вы пытаетесь bubble-sort и вы не реализуете его правильно (вы должны держать итерацию до тех пор, пока итерация не преформы свопа ни разу) - вот почему вы не Я действительно разбираюсь.

Во-вторых, вещий способ "своп" не является:

temp = int_list[i] 
int_list[i] = int_list[i+1] 
int_list[i+1] = temp 

а:

int_list[i], int_list[i+1] = int_list[i+1], int_list[i] 
+0

В отношении «pythonese», если хотите, в конце вашего ответа: работает ли это как 'int_list [i] = int_list [i + 1]' и 'int_list [i + 1] = int_list [i] 'эффективно приравнивая первую запись с левой стороны к первой записи справа? Aka: Могу ли я использовать ту же структуру с выражением равенства длины n (как показано выше)? – Matt

+1

@Matt почему бы вам не попробовать? ;) – alfasin

0

Ваш оператор return int_list с отступом слишком далеко - он находится в цикле for, поэтому ваша функция завершается в конце первой итерации.

Кроме того,

int_list = [] 
for i in range(10):  #Creates a 10-entry list of randon ints 
    int_list.append(random.randint(0,10)) 

может быть уменьшена до

int_list = [random.randint(0, 10) for i in range(10)] 

и while только когда-нибудь работать 0 или 1 раз (вы можете просто использовать if).

Кроме того, похоже, что вы просто делаетепервый проходпузырьковой сортировки - он переместит максимальное значение в конец списка, но не приведет к полностью отсортированному списку. Вам понадобится еще один цикл for, чтобы сделать это повторно (значения «bubbling up»).

Смежные вопросы