Реализация сортировки по возрастанию в списке питонов - PullRequest
1 голос
/ 11 октября 2011

Как часть назначения Python, я пытаюсь реализовать сортировку списка (по возрастанию) без использования метода sort () , я думаю, что моя логика верна, но я продолжаю получать ошибку:

sample=[23,44,12,1,6,87]
temp=0
for i in range(0,len(sample)):
    if sample[i] > sample[i+1]:
        sample[i]=temp
        sample[i]=sample[i+1]
        sample[i+1]=temp

Это дает мне список : ошибка индекса вне диапазона , который, как я знаю, вызван тем, что когда i == 3, код все еще делает i + 1.

Нужна помощь с этим ..

Я изменил код на:

for i in range(0,len(sample)-1):
    if sample[i] > sample[i+1]:
        temp=sample[i]
        sample[i]=sample[i+1]
        sample[i+1]=temp

, который устраняет ошибку, но не сортирует список

Ответы [ 4 ]

1 голос
/ 11 октября 2011

Я надеялся, что вы поняли, почему вы получили индекс из-за ошибки диапазона.

Это было одной из проблем, но теперь давайте рассмотрим ваш код, потому что у вас есть какая-то "концептуальная" ошибка, в том смысле, что выне совсем понимаете, что делает код, который вы сделали.

Это то, что на самом деле делает ваш код, и именно так вы должны думать, когда получаете такие ошибки:

sample=[23,44,12,1,6,87]
temp=0


for i in range(0,len(sample)-1):
    if sample[i] > sample[i+1]:
        temp=sample[i]
        sample[i]=sample[i+1]
        sample[i+1]=temp

Первая строка:Ваш i получит значения от 0,1,2 до 5 (в данном случае).

Вторая строка: он будет проверять, находятся ли члены списка , которые находятся рядом друг с другом .

Он проверит, больше ли первое (слева направо), чем второе, проверит 23> 44, что будет ложным, поэтому он не будет выполнять остальную часть кода.

Нет i будет 1, поэтому вы будете проверять 44> 12, это верно, поэтому ваш код выполнится и успешно поменяет местами эти два.

Это хороший моментнаучиться плавно менять переменные в python, не используя temporвсе переменные.

sample[i], sample[i+1] = sample[i+1], sample[i]

Подробнее об этом, если хотите, смените переменную Google Python.

Итак, вернемся к исходной проблеме.

Вы успешно поменялись местами 44и 12, этот список стоит [23,12,44,1,6,87].

Но если вы продолжите делать это, он будет:

Поменять 44 с 1

Поменять 44 с 6

Не меняйте 44 на 87.

Но теперь список будет [23,12,1,6,44,87], и ваш код перестанет себя выполнять, потому что i теперь равен 5.

Вы поймали проблему?

Вам нужно будет повторно запустить его несколько раз, чтобы фактически упорядочить его, так как он не проверяет, организован ли список, а меняет местами элементы, которые находятся рядом друг с другом.

Так что, если бы вы ( для этого конкретного списка ) запустили:

for j in range(3):
    for i in range(0,len(sample)-1):
        if sample[i] > sample[i+1]:
            sample[i], sample[i+1] =sample[i+1], sample[i]

Список был бы упорядочен.

Сортировка упорядоченных коллекций, таких как списки, очень изучена "field ".

Я бы порекомендовал вам ознакомиться с алгоритмами сортировки, начиная с очень простых, таких как пузырьковая сортировка.поскольку это «куда вы идете» с вашим алгоритмом (например, onatm предложил).

Существуют "забавные" способы изучить этот алгоритм, например, проверить это.

Читайте это тоже, если вам интересно.

Этот сайт довольно хорошо иллюстрирует, как алгоритмы работают своим способомв отсортированный список.

Удачи, пожалуйста, прокомментируйте, если у вас есть какие-либо сомнения.

1 голос
/ 11 октября 2011

отметьте это: http://faculty.cs.niu.edu/~hutchins/csci241/sorting.htm

сортировка пузыря питона:

sample=[23,44,12,1,6,87]

sorted = False
while not sorted:
    sorted = True
    for i in range(len(sample) - 1):
        if sample[i] > sample[i+1]:
            sorted = False
            sample[i], sample[i+1] = sample[i+1], sample[i]

print sample

изменено отсюда: Bubble Sort Homework

0 голосов
/ 11 октября 2011

Я не слишком знаком с Python, но я верю, что это когда вы делаете:

for i in range(0,len(sample)):
    if sample[i] > sample[i+1]:

Я бы попробовал изменить его на:

for i in range(0,len(sample) - 1):
    if sample[i] > sample[i+1]:

Надеюсь, это поможет.

0 голосов
/ 11 октября 2011

len(t) ссылается на что-то вне кода, который вы опубликовали.Вы хотите

for i in range(0,len(sample)-1):

Кроме того, вышеприведенный оператор будет увеличивать для вас i, нет необходимости в операторе i += 1.Python также будет обрабатывать инициализацию i для вас, поэтому оператор i = 0 также не нужен.После того, как они будут исправлены, вы увидите, что ваш сортировка по-прежнему неверна, но вы можете найти лучший способ выяснить, почему.

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