plik


ÿþSortowanie  szybkie Quick_Sort Tony Hoare (1960) Algorytm sortowania QuickSort Cechy algorytmu: Przecitna zBo|ono[ obliczeniowa O(nlgn), Pesymistyczna zBo|ono[ O(n2), Sortowanie  w miejscu , Niestabilny, Zastosowanie techniki  dziel i zwyci|aj , Algorytm rekurencyjny. Rozproszone sortowanie, WpByw danych wej[ciowych na zBo|onoo[ obliczeniow, Aatwa implementacja, Sprawdza si w sortowaniu [rednich i du|ych zbiorów danych. ASD LJ S Algorytm sortowania QuickSort Podstawowy etap algorytmu: 1. Wybór elementu osiowego (dzielcego) (pivotpoint) v=A[q], 2. Pogrupowanie elementów tablicy A[lewy.. prawy] w sposób nastpujcy: |aden z elementów A[lewy], ..., A[q-1]  nie wikszy ni| v, |aden z elementów A[q+1], ..., A[prawy]  nie mniejszy ni| v, Warianty schematu algorytmu: Rekurencyjny, nierekurencyjny Wybór elementu osiowego: pierwszy, [rodkowy lub ostatni, losowy, mediana z 3. ASD LJ S Algorytm QuickSort ZakBadajc, |e wybierany jest element osiowy jako pierwszy element tablicy tj. v=A[lewy] otrzymujemy podziaB: v i j prawy lewy elementy d" v v elementy e" v prawy lewy prawy lewy Dzielenia tablicy dokonuje procedura podziaBu (partition). ASD LJ S Algorytm sortowania QuickSort DziaBanie procedury podziaBu (element osiowy A[lewy]): 1. Wybór elementu osiowego np. v=A[lewy] dzielcego tablic A[lewy..prawy], 2. Przegldanie A[lewy+1], ,A[prawy] od strony lewej, dopóki nie zostanie znaleziony element  wikszy równy od v, 3. Przegldanie A[lewy+1], ,A[prawy] od strony prawej, dopóki nie zostanie znaleziony element  mniejszy równy od v, 4. Dwa elementy, na których si zatrzymuj si indeksy, wymieniane s miejscami. Przeszukiwanie kontynuuowane jest od lewej a pózniej od prawej, 5. Kiedy indeksy si spotkaj proces podziaBu koDczy si, 6. Element osiowy v zamieniany jest z ostatnim elementem lewej cz[ci tablicy. ASD LJ S Algorytm sortowania QuickSort Mechanizm sortowania: wartownik " " " " 6 3 7 4 8 5 2 9 j i 6 " " " " 5 3 2 4 8 7 9 8 7 9 5 4 3 2 4 2 3 2 3 ASD LJ S Algorytm sortowania QuickSort Mechanizm sortowania: Partition(A,lewy,prawy) {//u\ycie wartownika A[prawy+1]=+" ; v=A[lewy]; i=lewy; j=prawy+1; DO{ DO i=i+1; WHILE (A[i]<v); DO j=j-1; WHILE (A[j]>v); IF (i<j) swap(A[i],A[j]); } WHILE(i<j) A[lewy]=A[j]; A[j]=v; return(j); } QuickSort(A,lewy,prawy) { q=Partition (A,lewy,prawy); IF(q-1>lewy)QuickSort(A,lewy,q-1); IF(q+1<prawy)QuickSort(A,q+1,prawy); } ASD LJ S Algorytm sortowania QuickSort Partition(A,lewy,prawy) { v=A[prawy]; i=lewy-1; FOR (j=lewy; jd"prawy-1; j=j+1) IF (A[j]d"v){ i=i+1; swap(A[i],A[j]); } swap(A[i+1],A[prawy]); return(i+1); } QuickSort(A,lewy,prawy) { q=Partition (A,lewy,prawy); IF(q-1>lewy)QuickSort(A,lewy,q-1); IF(q+1<prawy)QuickSort(A,q+1,prawy); } ASD LJ S ZBo|ono[ algorytmu QuickSort ZBo|ono[ obliczeniowa algorytmu zale|y od zrównowa|enia podziaBów tablicy: PodziaB niezrównowa|ony PodziaB zrównowa|ony PodziaB niezrównowa|ony (przypadek najgorszy) - |aden element nie zostaje umieszczony po lewej stronie elementu osiowego przez procedur podziaBu. PodziaB zrównowa|ony (przypadek najlepszy) - gdy element osiowy dzieli tablic na dwie równe cz[ci. ASD LJ S ZBo|ono[ algorytmu QuickSort Pesymistyczna zBo|ono[ (podziaB niezrównowa|ony). PodziaB niezrównowa|ony - gdy procedura Partition tworzy dwie podtablice: 1-elementow (n-1) elementow Po prawej stronie, elementu osiowego otrzymujemy tablic pomniejszon tylko o jeden element. ZakBadamy, |e podziaBy niezrównowa|one bd wykonywane w ka|dym kroku algorytmu. ASD LJ S ZBo|ono[ algorytmu ZBo|ono[ pesymistyczna: T(n) = T(1) + T(n-1) + Tpart(n) PodziaB tablicy Sortowanie tablicy n -elementowej Sortowanie tablicy (n-1)-elementowej Sortowanie tablicy 1-elementowej T(1)=0 ZBo|ono[ procedury Partition. Rozmiar danych wej[ciowych n=prawy lewy +1 Tpart(n) = n-1 = ˜(n) ASD LJ S ZBo|ono[ algorytmu ZBo|ono[ czasowa procedury Partition. Rozmiar danych wej[ciowych n=prawy lewy +1 Tpart(n) = n-1 = ˜(n) Pesymistyczna zBo|ono[ sortowania (podziaB niezrównowa|ony). ˜(1) n = 1 0 n = 1 T(n) = T(n) = T(n-1) + ˜(n) n > 1 T(n-1) + (n-1) n > 1 n-1 n -1 T(n) = T(n-1) + ˜(n) = T(1) + " ˜(k) = ˜(1) + " ˜(k) = ˜("n-1k=1 k) = ˜(n2) k=1 k=1 ASD LJ S PodziaB niezrównowa|ony Drzewo rekurencji: (n-1) n 1 (n-2) n-1 1 (n-3) n-2 1 1 2 ˜(n2) 1 1 T(n) = 1+ 2+ ... +(n-1) = n(n-1)/2 = ˜(n2) ASD LJ S PodziaB zrównowa|ony Zrównowa|one drzewo podziaBu: ˜(n) n ˜(n) n/2 n/2 lgn podziaBów ˜(n) n/4 n/4 n/4 n/4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 T(n) = lgn ˜(n) = ˜(n lgn) ˜(1) n = 1 T(n) = 2T(n/2) + ˜(n) n > 1 Rozwizaniem równania jest T(n) = ˜(n lgn) ASD LJ S ZBo|ono[ algorytmu QuickSort ZBo|ono[ algorytmu (podziaB zrównowa|ony). 0 dla n = 1 T(n) = 2 T(n/2) + (n  1) dla n > 1 T(n) = 2k T(n/2k) + 2k-1 (n/2k-1 -1) + 2k-2 (n/2k-2 -1) + ... + 21 (n/2 -1) + 20 (n -1) = = (n - 2k-1) + (n - 2k-2) + ...+ (n - 2-1) + (n -1) = = k n  (1+2+...+2k-1) = kn  ((2k-1) / (2-1)) = kn  (2k  1) = = nlgn  (n-1) T(n) = O(nlgn) ASD LJ S ZBo|ono[ algorytmu QuickSort Poprawno[ rozwizania: T(n) = nlgn  n+1 T(2n) = 2n lg(2n) - 2n + 1 = 2n(lg2 + lgn)  2n + 1 = = 2nlgn + 1 = 2(nlgn  n +1)+ 2n -2 +1 = = 2T(n) + 2n -1 T(2n) = 2T(n) + 2n - 1 T(n) = ˜(n lgn) ASD LJ S ZBo|ono[ algorytmu QuickSort Przecitna zBo|ono[ obliczeniowa algorytmu. Równanie rekurencyjne: n 1 (n) = (n -1) + (T ( j -1) + (n - j)) T ave " ave T ave n j=1 ‘! czas realizacji procedury partition 1 - prawdopodobieDstwo tego, |e zwracana przez procedur partition n warto[ jest równa j. 2 (n) = n log n + O(n) T ave log e log a" log10 ASD LJ S Wra|liwo[ algorytmu QuickSort Pesymistyczna wra|liwo[ czasowa algorytmu: "(n)=O(n2 - nlgn) = O(n2) Oczekiwana wra|liwo[ czasowa: 2 2 Ã (n) = (7 - ) n + O(log n) À 3 “! 0.68 ASD LJ S Sortowanie przez scalanie Merge_Sort John von Neumann Sortowanie przez scalanie Cechy algorytmu: ZBo|ono[ obliczeniowa O(nlgn), Stabilny, Sortowanie ekstensywne, Zastosowanie techniki  dziel i zwyci|aj , Algorytm rekurencyjny, ASD LJ S Sortowanie przez scalanie Idea algorytmu mergeSort. 5 2 4 6 1 3 2 6 1 2 2 3 4 5 6 6 5 2 4 6 1 3 2 6 2 4 5 6 1 2 3 6 5 2 4 6 1 3 2 6 5 2 4 6 1 3 2 6 2 5 4 6 1 3 2 6 5 2 4 6 1 3 2 6 2 6 2 5 4 6 1 3 2 4 5 6 1 2 3 6 1 2 2 3 4 5 6 6 ASD LJ S Sortowanie przez scalanie Merge (A,lewy,q,prawy) MergeSort (A, lewy, prawy) { // B-tablica pomocnicza { i=lewy; IF(lewy<prawy){ j=q+1; q:= ðø(lewy+prawy)/2ûø k=1; MergeSort (A,lewy,q) WHILE(id"q and jd"prawy) { MergeSort (A,q+1,prawy) IF(A[i]<A[j]){ B[k]=A[i]; Merge (A,lewy,q,prawy) i=i+1; } }ELSE{ } B[k]=A[j]); j=j+1; } k=k+1; } IF(i>q ) Kopiuj A[j],...,A[prawy] do B[k],...,B[prawy]; ELSE Kopiuj A[i],...,A[q] do B[k],...,B[prawy]; Kopiuj B[lewy],...,B[prawy] do A[lewy],...,A[prawy]; } ASD LJ S ZBo|ono[ algorytmu MergeSort Drzewa podziaBu algorytmu Merge_sort. 16 8 8 4 4 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10 5 5 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 ASD LJ S ZBo|ono[ algorytmu MergeSort ˜(1) dla n = 1 T(n) = 2 T(n/2) + ˜(n) dla n > 1 0 dla n = 1 T(n) = 2 T(n/2) + (n  1) dla n > 1 ASD LJ S ZBo|ono[ algorytmu MergeSort ˜(1) dla n = 1 T(n) = 2 T(n/2) + ˜(n) dla n > 1 0 dla n = 1 T(n) = 2 T(n/2) + (n  1) dla n > 1 T(n) = 2k T(n/2k) + 2k-1 (n/2k-1 -1) + 2k-2 (n/2k-2 -1) + ... + 21 (n/2 -1) + 20 (n -1) = = (n - 2k-1) + (n - 2k-2) + ...+ (n - 2-1) + (n -1) = = k n  (1+2+...+2k-1) = kn  ((2k-1) / (2-1)) = kn  (2k  1) = = nlgn  (n-1). T(n) = ˜(nlgn) ASD LJ S ZBo|ono[ algorytmu MergeSort Poprawno[ rozwizania: T(n) = nlgn  n+1 T(2n) = 2n lg(2n) - 2n + 1 = 2n(lg2 + lgn)  2n + 1 = = 2nlgn + 1 = 2(nlgn  n +1)+ 2n -2 +1 = = 2T(n) + 2n -1 T(2n) = 2T(n) + 2n - 1 T(n) = ˜(n lgn) ASD LJ S

Wyszukiwarka