Неверные результаты из пользовательской функции сортировки в Python - PullRequest
0 голосов
/ 26 марта 2012

Я создал функцию сортировки для сортировки списков целых чисел, от высшего к низшему.Вот код:

def sort(list):
    s = []
    dropnum = 0
    l = len(list) - 1
    counter = 0
    s.append(list[0])
    while 1:
        maximum = len(s)
        if counter == l:
            break
        if list[counter] < s[dropnum]:
            dropnum = dropnum + 1
        else:
            counter = counter + 1
            if dropnum >= maximum:
                a.append(list[counter])
            else:
                s.insert(dropnum, list[counter])
            dropnum = 0
    return s
print sort([70,9,24,82,102])

Я должен получить в качестве вывода:

[102,82,70,24,9]

Но я получаю:

[102, 82, 24, 9, 70]

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Как я уверен, вы уже знаете, встроенный в Python sorted() - гораздо более эффективный способ сортировки.

print sorted([70,9,24,82,102], reverse=True)

Предполагая, что это учебное упражнение, я думаю, это то, что вы пытаетесь сделать

def sort(lst):
    s = []
    for item in lst:
        dropnum = 0
        while dropnum < len(s) and s[dropnum] > item:
            dropnum += 1
        s.insert(dropnum, item)
    return s
print sort([70,9,24,82,102])

Вам не нужна эта переменная счетчика, если вы просматриваете циклперечислите обычный способ Python

for item in lst:    # loop through the items in the input
0 голосов
/ 26 марта 2012

У вас есть несколько более простых опций, встроенных в python:

list.sort(...)  # in-place, more memory efficient

и:

sorted(my_iterable, ...)  # returns a new copy

Оба, которые необязательно принимают логический флаг reverse, пользовательское сравнение cmpfunction и key для определения, какой элемент сортировать по

. Я полагаю, что оба они используют вариант реализации быстрой сортировки внутри (для больших коллекций и более простой итеративный алгоритм для небольших коллекций).для версий Python 2.3+ сортировка гарантированно будет стабильной.

Кроме того, вы не должны именовать аргументы или переменные с тем же именем, что и встроенные функции или типы (например, list), так как вы загрязняете пространство имен втекущая область.

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