У меня проблема с моим кодом, который, надеюсь, кто-то здесь может решить. Код работает с алгоритмом 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)
Вы можете отменить все свои операторы сравнения при заданном 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]
В Python мы обычно пытаемся использовать имена с верхним индексом только для класса, поэтому избегайте наименования списка L
, используйте l
вместо или lst
.
Кроме того, чтобы выбрать случайный стержень, использование random.choice
является более аккуратным, чем random.randint
.
Если ваш список не восходит, то более крупные элементы попадают на более мелкие на выходе. Не забудьте передать 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. Вы должны попробовать написать реализацию, которая заменяет только элементы во входном списке.