Sortowane szybke Quck Sort Algorytm sortowana szybkego opera sę na strateg "dzel zwycęża" (ang. dvde and conquer), którą możemy krótko scharakteryzować w trzech punktach: 1. DZIEL - problem główny zostae podzelony na podproblemy 2. ZWYCIĘŻAJ - znaduemy rozwązane podproblemów 3. POŁĄCZ - rozwązana podproblemów zostaą połączone w rozwązane problemu głównego Idea sortowana szybkego est następuąca: (DZIEL) : naperw sortowany zbór dzelmy na dwe częśc w tak sposób, aby wszystke elementy leżące w perwsze częśc (zwane lewą partycą) były mnesze lub równe od wszystkch elementów druge częśc zboru (zwane prawą partycą). (ZWYCIĘŻAJ) : każdą z partyc sortuemy rekurencyne tym samym algorytmem. (POŁĄCZ) : połączene tych dwóch partyc w eden zbór dae w wynku zbór posortowany. Sortowane szybke zostało wynalezone przez angelskego nformatyka, profesora Tony'ego Hoare'a w latach 60-tych ubegłego weku. W przypadku typowym algorytm ten est naszybszym algorytmem sortuącym z klasy złożonośc oblczenowe O(n log n) - stąd pochodz ego popularność w zastosowanach. Musmy ednak pamętać, ż w pewnych sytuacach (zależnych od sposobu wyboru pwotu oraz nekorzystnego ułożena danych weścowych) klasa złożonośc oblczenowe tego algorytmu może sę degradować do O(n 2 ), co prof. Tony Hoare węce, pozom wywołań rekurencynych może spowodować przepełnene stosu zablokowane komputera. Z tych powodów algorytmu sortowana szybkego ne można stosować bezmyślne w każde sytuac tylko dlatego, ż est uważany za eden z naszybszych
algorytmów sortuących - zawsze należy przeprowadzć analzę możlwych danych weścowych właśne pod kątem przypadku nekorzystnego - czasem lepszym rozwązanem może być zastosowane algorytmu sortowana przez kopcowane, który ngdy ne degradue sę do klasy O(n 2 ). Tworzene partyc Do utworzena partyc musmy ze zboru wybrać eden z elementów, który nazwemy pwotem. W lewe partyc znadą sę wszystke elementy newększe od pwotu, a w prawe partyc umeścmy wszystke elementy nemnesze od pwotu. Położene elementów równych ne wpływa na proces sortowana, zatem mogą one występować w obu partycach. Równeż porządek elementów w każde z partyc ne est ustalony. Jako pwot można wyberać element perwszy, środkowy, ostatn, medanę lub losowy. Dla naszych potrzeb wyberzemy element środkowy: pwot d[(lewy + prawy) dv 2] pwot - element podzałowy d[ ] - dzelony zbór lewy - ndeks perwszego elementu prawy - ndeks ostatnego elementu Dzelene na partyce polega na umeszczenu dwóch wskaźnków na początku zboru - oraz. Wskaźnk przebega przez zbór poszukuąc wartośc mneszych od pwotu. Po znalezenu take wartośc est ona wymenana z elementem na pozyc. Po te operac wskaźnk est przesuwany na następną pozycę. Wskaźnk zapamętue pozycę, na którą traf następny element oraz na końcu wskazue mesce, gdze znadze sę pwot. W trakce podzału pwot est bezpeczne przechowywany na ostatne pozyc w zborze. Dla przykładu podzelmy na partyce zbór: { 7 2 4 7 3 1 4 6 5 8 3 9 2 6 7 6 3 } Lp. Operaca Ops 1. 2. 7 2 4 7 3 1 4 6 5 8 3 9 2 6 7 6 3 7 2 4 7 3 1 4 6 3 8 3 Wyznaczamy na pwot element środkowy. Pwot wymenamy z ostatnm elementem zboru
3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 7 2 4 7 3 1 4 6 3 8 3 7 2 4 7 3 1 4 6 3 8 3 2 7 4 7 3 1 4 6 3 8 3 2 7 4 7 3 1 4 6 3 8 3 2 4 7 7 3 1 4 6 3 8 3 2 4 7 7 3 1 4 6 3 8 3 2 4 3 7 7 1 4 6 3 8 3 2 4 3 7 7 1 4 6 3 8 3 2 4 3 1 7 7 4 6 3 8 3 2 4 3 1 7 7 4 6 3 8 3 2 4 3 1 4 7 7 6 3 8 3 2 4 3 1 4 7 7 6 3 8 3 2 4 3 1 4 3 7 6 7 8 3 Na początku zboru ustawamy dwa wskaźnk. Wskaźnk będze przeglądał zbór do przedostatne pozyc. Wskaźnk zapamętue mesce wstawana elementów mneszych od pwotu Wskaźnkem szukamy elementu mneszego od pwotu Znalezony element wymenamy z elementem na pozyc -te. Po wymane wskaźnk przesuwamy o 1 pozycę. Wymenamy przesuwamy. Wymenamy przesuwamy. Wymenamy przesuwamy. Wymenamy przesuwamy. Wymenamy przesuwamy.
16. 2 4 3 1 4 3 7 6 7 8 3 17. 18. 19. 20. 2 4 3 1 4 3 3 6 7 8 7 2 4 3 1 4 3 3 6 7 8 7 2 4 3 1 4 3 3 2 7 8 7 9 6 6 7 6 5 2 4 3 1 4 3 3 2 5 8 7 9 6 6 7 6 7 ^ Lewa partyca Prawa partyca Wymenamy przesuwamy. Wymenamy przesuwamy. Brak dalszych elementów do wymany. Pwot wymenamy z elementem na pozyc -te. Podzał na partyce zakończony. Po zakończenu podzału na partyce wskaźnk wyznacza pozycę pwotu. Lewa partyca zawera elementy mnesze od pwotu rozcąga sę od początku zboru do pozyc - 1. Prawa partyca zawera elementy wększe lub równe pwotow rozcąga sę od pozyc + 1 do końca zboru. Operaca podzału na partyce ma lnową klasę złożonośc oblczenowe - O(n). Specyfkaca problemu Sortu_szybko(lewy, prawy) Dane weścowe d[ ] - Zbór zaweraący elementy do posortowana. Zakres ndeksów elementów est dowolny. lewy - ndeks perwszego elementu w zborze, lewy C prawy - ndeks ostatnego elementu w zborze, prawy C Dane wyścowe d[ ] - Zbór zaweraący elementy posortowane rosnąco
Zmenne pomocncze pwot - element podzałowy, - ndeksy,, C Lsta kroków Algorytm sortowana szybkego wywołuemy podaąc za lewy ndeks perwszego elementu zboru, a za prawy ndeks elementu ostatnego (czyl Sortu_szybko(1,n)). Zakres ndeksów est dowolny - dzęk temu ten sam algorytm może równeż sortować fragment zboru, co wykorzystuemy przy sortowanu wylczonych partyc.
Schemat blokowy Na element podzałowy wyberamy element leżący w środku dzelone partyc. Wylczamy ego pozycę zapamętuemy ą tymczasowo w zmenne. Robmy to po to, aby dwukrotne ne wykonywać tych samych rachunków. Element d[] zapamętuemy w zmenne pwot, a do d[] zapsuemy ostatn element partyc. Dzęk te operac pwot został usunęty ze zboru. Ustawamy zmenną na początek partyc. Zmenna ta zapamętue pozycę podzału partyc. W pętl sterowane zmenną przeglądamy kolene elementy od perwszego do przedostatnego (ostatn został umeszczony na pozyc pwotu, a pwot zapamętany). Jeśl -ty element est mneszy od pwotu, to trafa on na początek partyc - wymenamy ze sobą elementy na pozycach -te -te. Po te operac przesuwamy punkt podzałowy partyc. Po zakończenu pętl element z pozyc -te przenosmy na konec partyc, aby zwolnć mesce dla pwotu, po czym wstawamy tam pwot. Zmenna wskazue zatem wynkową pozycę pwotu. Perwotna partyca została podzelona na dwe partyce:
partyca lewa od pozyc lewy do - 1 zawera elementy mnesze od pwotu partyca prawa od pozyc + 1 do pozyc prawy zawera elementy wększe lub równe pwotow. Sprawdzamy, czy partyce te obemuą węce nż eden element. Jeśl tak, to wywołuemy rekurencyne algorytm sortowana szybkego przekazuąc mu grance wyznaczonych partyc. Po powroce z wywołań rekurencynych partyca wyścowa est posortowana rosnąco. Kończymy algorytm.