Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych Autor artykułu: mgr Jerzy Wałaszek |
©2014 mgr
Jerzy Wałaszek
|
AlgorytmAlgorytm sortowania szybkiego opiera się na strategii "dziel i zwyciężaj" (ang. divide and conquer), którą możemy krótko scharakteryzować w trzech punktach:
Idea sortowania szybkiego jest następująca:
Sortowanie szybkie zostało wynalezione przez angielskiego informatyka,
profesora
Tony'ego Hoare'a w latach 60-tych ubiegłego
wieku. W przypadku typowym algorytm ten jest najszybszym algorytmem
sortującym z klasy złożoności obliczeniowej
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tworzenie partycji
Do utworzenia partycji musimy ze zbioru wybrać jeden z elementów, który nazwiemy
piwotem. W lewej partycji znajdą się wszystkie elementy niewiększe od
piwotu, a w prawej partycji umieścimy wszystkie elementy niemniejsze od piwotu.
Położenie elementów równych nie wpływa na proces sortowania, zatem mogą one
występować w obu partycjach. Również porządek elementów w każdej z partycji nie
jest ustalony.
Jako piwot można wybierać element pierwszy, środkowy, ostatni, medianę lub losowy. Dla naszych potrzeb wybierzemy element środkowy:
Dzielenie na partycje polega na umieszczeniu dwóch wskaźników na początku zbioru - i oraz j. Wskaźnik i przebiega przez zbiór poszukując wartości mniejszych od piwotu. Po znalezieniu takiej wartości jest ona wymieniana z elementem na pozycji j. Po tej operacji wskaźnik j jest przesuwany na następną pozycję. Wskaźnik j zapamiętuje pozycję, na którą trafi następny element oraz na końcu wskazuje miejsce, gdzie znajdzie się piwot. W trakcie podziału piwot jest bezpiecznie przechowywany na ostatniej pozycji w zbiorze.
Przykład:
Dla przykładu podzielimy na partycje zbiór: { 7 2 4 7 3 1 4 6 5 8 3 9 2 6 7 6 3 }
Po zakończeniu podziału na partycje wskaźnik j
wyznacza pozycję piwotu. Lewa partycja zawiera elementy mniejsze od
piwotu i rozciąga się od początku zbioru do pozycji
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Specyfikacja problemuSortuj_szybko(lewy, prawy)Dane wejściowe
Dane wyjściowe
Zmienne pomocnicze
Lista kroków
Algorytm sortowania szybkiego wywołujemy podając za lewy indeks pierwszego elementu zbioru, a za prawy indeks elementu ostatniego (czyli Sortuj_szybko(0,n-1)). Zakres indeksów jest dowolny - dzięki temu ten sam algorytm może również sortować fragment zbioru, co wykorzystujemy przy sortowaniu wyliczonych partycji.
Schemat blokowyNa element podziałowy wybieramy element leżący w środku dzielonej partycji. Wyliczamy jego pozycję i zapamiętujemy ją tymczasowo w zmiennej i. Robimy to po to, aby dwukrotnie nie wykonywać tych samych rachunków. Element Ustawiamy zmienną j na początek partycji. Zmienna ta zapamiętuje pozycję podziału partycji. W pętli sterowanej zmienną i przeglądamy
kolejne elementy od pierwszego do przedostatniego (ostatni
został umieszczony na pozycji piwotu, a piwot zapamiętany). Jeśli Po zakończeniu pętli element z pozycji
Sprawdzamy, czy partycje te obejmują więcej niż jeden element.
Jeśli tak, to wywołujemy rekurencyjnie algorytm sortowania szybkiego przekazując
mu granice wyznaczonych partycji. Po powrocie z wywołań rekurencyjnych partycja
wyjściowa jest posortowana rosnąco. Kończymy algorytm.
|
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe