Моя быстрая сортировка в Python3 преодолевает предел рекурсии - PullRequest
1 голос
/ 14 февраля 2020
from random import *
from time import *
import sys


def quicksort(mylist, pivot, end):
    # pivot will always be the first element in the list/sub-list
    if (len(mylist) == end) and (pivot == 0):  # shuffle the list before we start (only happens on the first call)
        shuffle(mylist)
    if (pivot == end) or (pivot == end-1):
        return mylist
    sr = pivot + 1  # start from element after pivot
    sl = end - 1  # start from end of list
    smaller = None
    bigger = None
    smallest_index = 0

    while sr <= sl:
        if mylist[sr] > mylist[pivot]:
            bigger = mylist[sr]
        else:
            sr += 1
        if mylist[sl] < mylist[pivot]:
            smaller = mylist[sl]
        else:
            sl -= 1
        if (sr < sl) and (smaller is not None) and (bigger is not None):
            mylist[sr] = smaller
            mylist[sl] = bigger
            smallest_index = sr
            sr += 1
            sl -= 1
            smaller = None
            bigger = None
        if (sr-1 == sl) and ((smaller is not None) or (mylist[sl] <= mylist[pivot])):
            smaller = mylist[sl]
            smallest_index = sl

    mylist[smallest_index], mylist[pivot] = mylist[pivot], mylist[smallest_index]
    quicksort(mylist, pivot, smallest_index)
    quicksort(mylist, smallest_index+1, end)
    return mylist

Я также использовал sys.setrecursionlimit (1000000), потому что он изначально превышал предел для больших списков, но в итоге я получил код выхода 0xC00000FD

Я работал над этим часами и просто не могу взломать это. Я не могу сказать, нужна ли мне просто лучшая реализация или я где-то ошибся. К сожалению, это была единственная реализация, которую я смог придумать.

Помогите, пожалуйста?

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