получить перевернутую сортированную быструю сортировку (в порядке убывания)

1

У меня проблема с моим кодом, который, надеюсь, кто-то здесь может решить. Код работает с алгоритмом quickSort, но я хочу, чтобы эта определенная часть кода дала мне отсортированный список отсортированных quickSort, поэтому список в порядке убывания. Может ли кто-то здесь помочь мне?

def quickSort(L, ascending = True):
    print('Quicksort, Parameter L:')
    print(L)
    if len(L) <= 1: return L
    smaller, equal, larger = [],[],[]
    pivot = L[randint(0,len(L)-1)]

    for x in L:
        if x < pivot: smaller.append(x)
        elif x == pivot: equal.append(x)
        else: larger.append(x)

    print('result: ', quickSort(smaller)+equal+quickSort(larger))
    return quickSort(smaller)+equal+quickSort(larger)


l1 = list([3, 2, -1, 9, 17, 4, 1, 0])

l2 = list([3.14159 , 1./127, 2.718 , 1.618 , -23., 3.14159]) 

l1 = mergeSort(l1)

l2 = quickSort(l2,False)
Теги:
list
algorithm
order
quicksort

2 ответа

0

Вы можете отменить все свои операторы сравнения при заданном ascending=False.

Хотя было бы проще использовать обертку для вашей функции, которая меняет список при задании этого параметра.

import random

def _quickSort(lst):
    print('Quicksort, Parameter L:', lst)
    if len(lst) <= 1:
        return lst
    smaller, equal, larger = [], [], []
    pivot = random.choice(lst)

    for x in lst:
        if x < pivot: smaller.append(x)
        elif x == pivot: equal.append(x)
        else: larger.append(x)

    print('result: ', _quickSort(smaller) + equal + _quickSort(larger))
    return _quickSort(smaller) + equal + _quickSort(larger)

def quickSort(lst, ascending=True):
    if ascending:
        return _quickSort(lst)
    else:
        return _quickSort(lst)[::-1]

Выход:

lst = [3, 2, -1, 9, 17, 4, 1, 0]

lst = quickSort(lst, ascending=False)

print(lst) # [17, 9, 4, 3, 2, 1, 0, -1]

Sidenotes

В Python мы обычно пытаемся использовать имена с верхним индексом только для класса, поэтому избегайте наименования списка L, используйте l вместо или lst.

Кроме того, чтобы выбрать случайный стержень, использование random.choice является более аккуратным, чем random.randint.

0

Если ваш список не восходит, то более крупные элементы попадают на более мелкие на выходе. Не забудьте передать ascending значение в рекурсивные вызовы.

from random import randint


def quickSort(L, ascending=True):
    if len(L) <= 1:
        return L
    smaller, equal, larger = [], [], []
    pivot = L[randint(0, len(L) - 1)]

    for x in L:
        if x < pivot:
            smaller.append(x)
        elif x == pivot:
            equal.append(x)
        else:
            larger.append(x)

    larger = quickSort(larger, ascending=ascending)
    smaller = quickSort(smaller, ascending=ascending)

    if ascending:
        final = smaller + equal + larger
    else:
        final = larger + equal + smaller
    return final


l2 = list([3.14159 , 1./127, 2.718 , 1.618 , -23., 3.14159])
print(quickSort(l2, ascending=False))
# [3.14159, 3.14159, 2.718, 1.618, 0.007874015748031496, -23.0]

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню