Musiałem wdrożyć algorytm QuickSort do zadania domowego w wybranym przez siebie języku i wybrałem Python.Lokalny QuickSort w Pythonie
Podczas wykładów powiedziano nam, że QuickSort jest wydajny w pamięci, ponieważ działa w miejscu; tj. nie ma żadnych dodatkowych kopii części tablicy wejściowej dla rekurencji.
Z tą myślą próbowałem wdrożyć algorytm QuickSort w Pythonie, ale wkrótce potem zdałem sobie sprawę, że aby napisać elegancki fragment kodu, będę musiał przekazać części tablicy do samej funkcji podczas rekursji. Ponieważ Python tworzy nowe listy za każdym razem, gdy to robię, próbowałem używać Python3 (ponieważ obsługuje on nielokalne słowo kluczowe). Oto mój skomentowany kod.
def quicksort2(array):
# Create a local copy of array.
arr = array
def sort(start, end):
# Base case condition
if not start < end:
return
# Make it known to the inner function that we will work on arr
# from the outer definition
nonlocal arr
i = start + 1
j = start + 1
# Choosing the pivot as the first element of the working part
# part of arr
pivot = arr[start]
# Start partitioning
while j <= end:
if arr[j] < pivot:
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
i += 1
j += 1
temp = arr[start]
arr[start] = arr[i - 1]
arr[i - 1] = temp
# End partitioning
# Finally recurse on both partitions
sort(start + 0, i - 2)
sort(i, end)
sort(0, len(array) - 1)
Teraz nie jestem pewien, czy dobrze wykonałem pracę, czy też czegoś brakuje. Napisałem bardziej Pythonową wersję QuickSorta, ale z pewnością nie działa ona w miejscu, ponieważ utrzymuje powracające części tablicy wejściowej i łączy je.
Moje pytanie brzmi: czy jest to sposób na zrobienie tego w Pythonie? Przeszukałem zarówno Google, jak i SO, ale nie znalazłem prawdziwej implementacji QuickSort w miejscu, więc pomyślałem, że najlepiej będzie zapytać.
Czy próbowałeś profilera pamięci Pythona, który daje Ci linia analizą pamięci linia. – Hemanth
Zamiast pisać funkcję wewnętrzną i używając 'nonlocal', dlaczego nie zdefiniujesz funkcji' quicksort', jak 'def quicksort (array, start = 0, end = None): if end is None: end = len (array) - 1 ... '?Ponadto standardową praktyką jest osobne zaimplementowanie funkcji 'partition', przez co kod quicksort staje się:' q = partycja (tablica, start, koniec) quicksort (tablica, start, q-1) quicksort (tablica, q + 1 koniec) ' – Bakuriu
Możesz przekazać' tablica' rekursywnie bez kopiowania; po prostu nie możesz tego pokroić. Ponadto nie potrzebujesz 'nonlocal', ponieważ zmieniasz tylko zawartość listy powiązanej z' arr', a nie która lista jest związana. –