Я пишу программу python, которая играет в покер для класса, и мне нужно отсортировать список из пяти карточных рук. У меня есть функция wins(), которая берет две руки и возвращает True, если первый из них бьет второй, False, если это не так. Я написал реализацию quicksort, чтобы отсортировать список рук, и я заметил, что это занимает гораздо больше времени, чем ожидалось, поэтому я запрограммировал его для печати длины каждого сортируемого списка. Функция выглядит следующим образом:Проблема с quicksort и python
def sort(l):
if len(l) <= 1:
return l
print len(l)
pivot = choice(l)
l.remove(pivot)
left = []
right = []
for i in l:
if wins(i, pivot) == True:
right.append(i)
else:
left.append(i)
return sort(left) + [pivot] + sort(right)
и когда у меня было это сортирует 64 руки, он напечатал: 64, 53, 39, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 12, 7, 3, 2, 3, 2, 4, 3 , 2, 13, 9, 6, 2, 3 , 2, 2, 3 , 10, 8, 2, 5, 4, 3, 2. Обратите внимание на последовательную последовательность посередине? Я не могу понять, почему это так, но это приводит к тому, что quicksort ведет себя как O (n^2). Для него не имеет смысла выбирать самую сильную руку в качестве стержня на каждой итерации, но это то, что, похоже, происходит. Что я не замечаю?
Почему вы пишете свой собственный вид?Не имеет ли у python собственную функцию сортировки? –
Я не сортирую числа, я сортирую покерные руки. –
Кажется, что нужно сделать [создать лямбда] (https://wiki.python.org/moin/HowTo/Sorting) для сортировки кортежей или именованных объектов. –