Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

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:

  1. Dziel: tablicę wejściową podziel na dwie podtablice, od indeksu p do indeksu q, tak aby przed elementem o indeksie q znalazł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 od pivot.

  2. 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.

  3. 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 miejscusortowanie w miejscu. Nie ma więc potrzeby łączenia elementów.

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:

Linia 1. funkcja sortowanieSzybkie otwórz nawias okrągły tablica przecinek p przecinek k zamknij nawias okrągły. Linia 2. jeżeli p otwórz nawias ostrokątny k wykonaj dwukropek. Linia 3. q znak równości podziałTablicy otwórz nawias okrągły tablica przecinek p przecinek k zamknij nawias okrągły. Linia 4. sortowanieSzybkie otwórz nawias okrągły tablica przecinek p przecinek q zamknij nawias okrągły. Linia 5. sortowanieSzybkie otwórz nawias okrągły tablica przecinek q plus 1 przecinek k zamknij nawias okrągły.
  • p to miejsce, od którego chcemy posortować tablicę; gdy chcemy wykonać sortowanie od początku tablicy, to p = 1,

  • k to miejsce zakończenia sortowania,

  • q to 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:

Linia 1. funkcja podziałTablicy otwórz nawias okrągły tablica przecinek p przecinek k zamknij nawias okrągły. Linia 2. pivot znak równości tablica otwórz nawias okrągły k zamknij nawias okrągły. Linia 3. i znak równości p minus 1. Linia 4. j znak równości k plus 1. Linia 5. dopóki prawda wykonuj dwukropek. Linia 6. wykonuj i znak równości i plus 1. Linia 7. dopóki i otwórz nawias ostrokątny znak równości k oraz tablica otwórz nawias okrągły i zamknij nawias okrągły otwórz nawias ostrokątny pivot. Linia 8. wykonuj j znak równości j minus 1. Linia 9. dopóki j zamknij nawias ostrokątny znak równości p oraz tablica otwórz nawias okrągły j zamknij nawias okrągły zamknij nawias ostrokątny pivot. Linia 10. jeżeli i otwórz nawias ostrokątny znak równości j wykonaj dwukropek. Linia 11. zamień tablica otwórz nawias okrągły i zamknij nawias okrągły z tablica otwórz nawias okrągły j zamknij nawias okrągły. Linia 12. w przeciwnym razie wykonaj dwukropek. Linia 13. zwróć j.
  • Za pomocą zmiennej pivot zapisujemy liczbę, która odpowiada za to, w której podtablicy umieścimy każdy z elementów. Jeżeli rozpatrywana liczba będzie mniejsza od pivot, 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. Zmienna pivot może być dowolnym elementem tablicy, np. pierwszym, ostatnim lub środkowym. My wybraliśmy ostatni element.

  • Następnie w zmiennych i oraz j zapisujemy 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. Indeks j zmniejszamy, aby w końcu znaleźć element mniejszy od pivot.

  • 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 i osią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:

RwGFU1wdspLEn
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

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 2).

R13CeGVW0C5qo
Źródło: Contentplus.pl sp. z o.o., licencja: CC BY-SA 3.0.

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:

O(nlogn)

Złożoność obliczeniowa takiego algorytmu w przypadku pesymistycznym to:

n22

Natomiast jego złożoność obliczeniowa w przypadku optymistycznym to:

n+2T(n2)

Słownik

sortowanie w miejscu
sortowanie w miejscu

algorytmy sortowania, w których elementy znajdują się cały czas w początkowej tablicy i nie jest potrzebna dodatkowa pamięć

pivot
pivot

element osiowy – element tablicy wybrany wedle ustalonego schematu; jest to element dzielący tablicę