Посмотрите в этих двух местах ...
# QSort ...
PIEnd=Partition(List, Start, End)
QSort(List,Start,PIEnd)
QSort(List,PIEnd+1,End)
# Partition
if Swaps % 2 ==0:
PIStart=PIStart+1
else:
PIEnd=PIEnd-1
Если у вас есть четное количество перестановок в любом разделе, то PIEnd
не изменится, и ваша косвенная рекурсия в QSort будут придерживаться тех же аргументов. Ваша первая лоу-половина рекурсия делает это. Пересмотрите свою логику c. Для начала вы должны , а не зависеть от глобальных переменных для решения.
Вот как я снабдил ваш код рекурсивной трассировкой:
call_count = 0
indent = ""
#QuickSort Function
def QSort(List, Start, End):
global call_count, indent
indent += " "
call_count += 1
print(indent, "ENTER QSort", Start, End, List)
if call_count > 2 * len(inp):
print(indent, "Too many calls")
exit(1)
if Start < End:
PIEnd=Partition(List, Start, End)
QSort(List,Start,PIEnd)
QSort(List,PIEnd+1,End)
print(indent, "ENTER QSort", Start, End, List)
indent = indent[2:]
return List
Вывод:
ENTER QSort 0 8 [2, 3, 6, 3, 9, 7, 8, 0, 5]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
ENTER QSort 0 4 [2, 3, 0, 3, 5, 7, 8, 9, 6]
Too many calls