Przeczytaj
Działanie algorytmu quick sort
Zasada działania algorytmu quick sort jest oparta na metodzie „dziel i zwyciężaj”.
W odniesieniu do sortowania szybkiego możemy ją przedstawić w trzech krokach:
Dziel: tablicę wejściową podziel na dwie podtablice, od indeksu
pdo indeksuq, tak aby przed elementem o indeksieqznalazły się elementy mniejsze lub równe elementowi osiowemu (ang. pivot), natomiast za tym elementem – większe lub równe. W ten sposób otrzymamy jedną tablicę o wartościach nie większych oraz drugą o wartościach nie mniejszych odpivot.Zwyciężaj: dla powstałych w ten sposób dwóch podtablic wywołujemy rekurencyjnie funkcję sortowania szybkiego, która ponownie dzieli je na dwie podtablice i tak do momentu, aż uzyskamy tablice jednoelementowe.
Połącz: powstałe podtablice są zazwyczaj łączone w jedną, posortowaną całość. Jednak w przypadku sortowania szybkiego, będziemy wykonywać sortowanie w miejscusortowanie w miejscu. Nie ma więc potrzeby łączenia elementów.

Film dostępny pod adresem /preview/resource/Rbb9mVRZrQpqS
Animacja przedstawia sortowanie wąskich kolumn od najniższej do najwyższej. Sortowanie przebiega bardzo szybko. Początkowo kolumny podlegające sortowaniu są różnej wielkości, są wymieszane. Następnie za pomocą przemieszczającej się strzałki w postaci łuku kolumny są porównywane i przestawiane od najniższej do najwyższej.
Pseudokod sortowania quick sort
Przeanalizujmy pseudokod sortowania quick sort:
pto miejsce, od którego chcemy posortować tablicę; gdy chcemy wykonać sortowanie od początku tablicy, top = 1,kto miejsce zakończenia sortowania,qto punkt podziału tablicy.
Rozpoczynamy funkcję sortowanieSzybkie dla całej tablicy, którą chcemy posortować. Jeżeli p jest mniejsze od k, czyli tablica składa się z więcej niż jednego elementu, to wykonujemy następujące czynności. Wywołujemy funkcję podziałTablicy, która dzieli tablicę na dwie podtablice, a punkt podziału zapisuje w zmiennej q. Teraz rekurencyjnie wywołujemy funkcję sortowanieSzybkie dla podtablic. Algorytm kończy działanie, gdy w wyniku podziału pozostaną tablice jednoelementowe.
Pseudokod funkcji podziałTablicy wygląda następująco:
Za pomocą zmiennej
pivotzapisujemy liczbę, która odpowiada za to, w której podtablicy umieścimy każdy z elementów. Jeżeli rozpatrywana liczba będzie mniejsza odpivot, umieścimy ją w tablicy pierwszej, jeżeli większa, to w drugiej, a jeżeli równa, to może pojawić się zarówno w pierwszej, jak i drugiej. Zmiennapivotmoże być dowolnym elementem tablicy, np. pierwszym, ostatnim lub środkowym. My wybraliśmy ostatni element.
Następnie w zmiennych
iorazjzapisujemy miejsca przed pierwszym oraz za ostatnim elementem tablicy, którą chcemy posortować.
Zwiększamy wówczas indeks
i, do momentu znalezienia elementu tablicy większego niżpivot. Indeksjzmniejszamy, aby w końcu znaleźć element mniejszy odpivot.
Po znalezieniu mniejszego elementu zmieniamy te elementów, aby uzyskać w podtablicach odpowiednie wartości.
Wymienione dwa punkty, opisujące czynności zamiany, wykonujemy do momentu, gdy
iosiągnie wartość większą niżj.
W tym momencie funkcja zwraca indeks
j, czyli punkt podziału tablicy.
Czas działania algorytmu
Złożoność obliczeniowa algorytmu sortowania szybkiego jest zależna od rozmiarów części, na jakie jest dzielona tablica. Jeżeli za każdym razem będzie wybierany pivot o wartości najmniejszej lub największej w tablicy, podział tablicy będzie nierównomierny. Tym samym poważnie wzrośnie czas działania algorytmu. W takim ujęciu przypadek optymistyczny i pesymistyczny nie są związane ze sposobem uporządkowania elementów w tablicy, ale z wyborem elementu osiowego, czyli ze sposobem dzielenia tablicy.
Rozważmy najpierw przypadek optymistyczny, którego złożoność obliczeniowa algorytmu wynosi O(n log n). Jeżeli tablica za każdym razem jest dzielona na dwie równe części, otrzymamy właśnie taki czas działania. Przedstawia to poniższy schemat:

W przypadku pesymistycznym tablica jest dzielona na dwie części, z których jedna zawiera jeden element, a druga resztę elementów. Złożoność obliczeniowa wynosi wtedy O(nIndeks górny 22).

Algorytm sortowania szybkiego – złożoność obliczeniowa
Założeniem algorytmu sortowania szybkiego jest – jak sama nazwa wskazuje – możliwie najkrótszy czas sortowania kosztem większego wykorzystania pamięci (wywołania rekurencyjne).
Średnia złożoność obliczeniowa algorytmu szybkiego sortowania wynosi:
Złożoność obliczeniowa takiego algorytmu w przypadku pesymistycznym to:
Natomiast jego złożoność obliczeniowa w przypadku optymistycznym to:
Słownik
algorytmy sortowania, w których elementy znajdują się cały czas w początkowej tablicy i nie jest potrzebna dodatkowa pamięć
element osiowy – element tablicy wybrany wedle ustalonego schematu; jest to element dzielący tablicę