Co to jest Quicksort?

Co to jest Quicksort?
Quicksort jest jednym z wydajnych algorytmów sortowania. Algorytm wykonuje sortowanie, stosując paradygmat podziału i podbojowy. Rozważ tablicę a [1… n] n elementów. Algorytm dzieli tablicę A na indeksie Q tak, że wszystkie elementy w podarunce po lewej stronie indeksu są mniejsze niż element w indeksie Q ([q]), a wszystkie elementy w prawej podarytce są większe niż a [Q]. Teraz algorytm rekurencyjnie sortuje dwa podmioty a [1… q-1] i [q+1… n], wywołując funkcję Quicksort. Aby uzyskać indeks q, algorytm używa funkcji partycji.

Funkcja partycji jest funkcją, która przyjmuje tablicę a [l… u] jako dane wejściowe. Tutaj, L jest dolna granica i u jest górną granicą tablicy. Algorytm znajduje indeks Q takie, że wszystkie pierwiastki mniejsze niż [q] spadają w podłodze A [l… q-1] i wszystkie elementy większe niż [q] spadają w podmieniu A [q+1… u]. Funkcja partycji osiąga to za pomocą elementu obrotowego i dwóch wskaźników - wskaźnika I i wskaźnika J do tablicy.

Wskaźnik J wskazuje na pierwszy element w tablicy, a wskaźnik I jest inicjowany jako J-1. Funkcja iteruje tablicę za pomocą wskaźnika j. Dla elementu A [j] element może być większy niż element obrotu lub mniej niż element obrotowy. Jeśli element jest większy niż element obrotu, wskaźnik J zostaje zwiększony, wskazując na następny element. Jeśli element A [j] jest mniejszy niż element obrotu, zwiększamy wskaźnik I, zamień [i] i [j]. Zamiana elementów pomaga utrzymać wskaźnik i tak, że elementy do elementu wskazanego wskaźnikiem i są mniejsze niż element obrotowy. Jako ostatni krok, funkcja partycji zamienia element obrotu z elementem przy indeksie I+1, tym samym przesuwając element obrotu we właściwej pozycji w tablicy partycjonowanej.

Kod źródłowy

def PARTITION (ARR, LB, UB):
# Ostatni element tablicy jest pobierany
# być elementem obrotowym
PIVOT_ELT = ARR [UB-1]
I = LB - 1
dla J w zakresie (LB, UB):
# Jeśli element jest mniejszy niż element obrotowy
Jeśli Arr [j] # Zamień elementy, aby elementy
# arr [lb… i] jest zawsze mniej niż element obrotowy
i = i + 1
arr [i], arr [j] = arr [j], arr [i]
# Ostateczna wymiana elementu obrotowego i ARR [i+1]
# Aby umieścić element obrotu na miejscu
ARR [i+1], arr [ub-1] = arr [Ub-1], arr [i+1]
zwróć i+1
def Quick_Sort (ARR, LB, UB):
if (lb# Rekurencyjne sortowanie tablicy
Q = partycja (ARR, LB, UB)
ARR = Quick_Sort (ARR, LB, Q)
ARR = Quick_Sort (ARR, Q+1, UB)
return ARR
Jeśli __name__ == "__main__":
ARR = [3, 7, 9, 2, 5, 0]
n = len (ARR)
ARR = Quick_Sort (ARR, 0, N)
Drukuj (ARR)

Najlepsza złożoność czasowa Quicksort to O (n log n). W najlepszym scenariuszu, w każdym wezwaniu do algorytmu, algorytm dzieli problem na dwa podproblety o równej wielkości. Najgorsza złożoność algorytmu Quicksort jest O (N^2). Dzieje się tak, gdy element partycji jest zawsze wybierany jako ostatni element, a tablica jest już sortowana.