Неправильный вывод в Python - согласно моей логике - PullRequest
0 голосов
/ 01 октября 2010

Может кто-нибудь сказать мне, почему моя программа работает странно.Я пытаюсь отсортировать list1 в порядке возрастания.Этот код является частью моей программы быстрой сортировки, которую я пытаюсь написать.Согласно моей логике, которую я применяю в этом коде, и я также проверил вручную, результат должен быть [1,2,3,4,5].Однако на выходе получается [1,2,2,4,5].Можете ли вы сказать, что происходит не так?

list1=[3,2,1,5,4]
n_list1=len(list1)
count=0

for position1, item1 in enumerate(list1[0:n_list1]):
    temp=item1
    count=count+1
    for position2 in range(count,n_list1):
        if list1[position1]>list1[position2]:
            list1[position1]=list1[position2]
            list1[position2]=temp
            temp=list1[position1]
print list1

РЕДАКТИРОВАТЬ: Я пытаюсь сделать так:

Я начинаю сравнивать первый элемент с следующимn-1) элементы и поменяйте местами самый маленький элемент с первым.Теперь я перехожу ко 2-му элементу и сравниваю его со следующими (n-2) элементами и меняю местами наименьший элемент среди этих (n-2) элементов.Таким образом я двигаюсь вперед.

Примечание: Это часть моей программы быстрой сортировки, которая сама по себе не является быстрой сортировкой.Эта часть предназначена для list1, которому я присваиваю числа, меньшие чем ось.Другой код будет для list2, где я буду назначать числа, больше чем pivot.

Ответы [ 3 ]

4 голосов
/ 01 октября 2010

Поскольку вы делаете count = count + 1 прямо перед самым внутренним for, вы никогда не достигнете первой позиции списка1 (list1[0]), который является элементом "3".

[Редактировать] Если присмотреться к вашему коду более тщательно, то возникает путаница.Например,

        list1[position1]=list1[position2]
        list1[position2]=temp
        temp=list1[position1]

Вы теряете list1 [position1]: вы перезаписываете его списком [position2], прежде чем пытаться сохранить его в переменной temp.Попробуйте переместить temp=list1[position1] на первую строку после if.

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

2 голосов
/ 01 октября 2010

Ответ, предоставленный rbp, абсолютно правильный!

Также, я думаю, вы могли бы упростить вышесказанное, удалив сам счетчик, а также непосредственно перечислить список и использовать идиому Python - a, b = b, aпоменять местами значения

list1=[3,2,1,6,5,4]
n_list1 = len(list1)
for position1, item1 in enumerate(list1):
    for position2 in range(position1,n_list1):
        if list1[position1]>list1[position2]:
            list1[position1] , list1[position2] = list1[position2], list1[position1]
print list1

Вывод:

[1, 2, 3, 4, 5, 6]

[Редактировать: Об идиоме]

>>> a = 4
>>> b = 5
>>> a , b  = b, a
>>> a
5
>>> b
4
>>> c  = 5
>>> d = 6
>>> t = c
>>> c = d
>>> d = t 
>>> c
6
>>> d
5
>>> 
0 голосов
/ 01 октября 2010

Небольшое улучшение для правильного ответа pyfunc ... Эта строка

for position2 in range(position1,n_list1) 

может быть

for position2 in range(position1+1,n_list1)

и сэкономит вам немного времени.

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