ALGORYTMY I STRUKTURY DANYCH WYKAD 04 Problem Sortowania
ALGORYTMY I STRUKTURY DANYCH WYKŁAD 04 Problem Sortowania Grażyna Mirkowska PJWSTK, 2003/2004 G. Mirkowska, ASD 04 Sortowanie
Plan wykładu 4 Sformułowanie problemu 4 Sortowanie przez porównywanie elementów – – – 2021 -03 -04 Sortowanie przez wstawianie Sortowanie przez selekcję Operacja scalania ciągów uporządkowanych Sortowanie przez scalanie Szybkie sortowanie G. Mirkowska, ASD 04 Sortowanie 2
Sformułowanie problemu Dany jest ciąg e elementów e 1, e 2, . . . , en należących do pewnej liniowo uporządkowanej przestrzeni <E, >. Znaleźć taką permutację i 1, i 2, . . . , in liczb 1, . . . , n aby ei 1 ei 2 . . . ein Znaleźć taką funkcję różnowartościową i „na” f : {1, 2. . . , n} {e 1, e 2, . . . , en }, że dla każdego i<n, f(i) f(i+1). 5 3 1 6 7 2 8 2021 -03 -04 1234567 3621457 1 2 3 5 6 7 8 G. Mirkowska, ASD 04 Sortowanie 3
Sortowanie przez selekcję Metoda Sortowanie odbywa się w n-1 przebiegach. W i-tym przebiegu szukamy i-tego najmniejszego elementu. Algorytm { for i : = 1 to n-1 do min : = i; j : = i+1; while j < n+1 do if e[j] < e[min] then min : = j fi od; swap(e[i], e[min]); od } Odcinek uporządkowany 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 4
Diagram przepływu i : = 1 e[1] . . . e[i-1] {e[i], . . . , e[n]} i<n tak nie e[1] . . . e[i-1] {e[i], . . . , e[n]} Znajdź x takie, że x = minimum( e[i], . . . , e[n]) i : = i+1 x {e[i], . . . , e[n]} Zamień miejscami x i e[i] e[1] . . . e[i-1] e[i] {e[i+1], . . . , e[n]} 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 5
Koszt algorytmu Twierdzenie Algorytm Selection_sort jest poprawnym rozwiązaniem problemu sortowania. W dowolnej strukturze danych, której elementy są liniowo uporządkowane przez relację , algorytm zatrzymuje się dla dowolnych danych i daje w wyniku ciąg uporządkowany niemalejąco. A. Jeśli operacją dominującą jest porównywanie elementów: T(n) = n-1 + n-2 +. . . +2 + 1 = n(n-1)/2 = (n 2) B. Jeśli operacją dominującą jest zamiana elementów T(n) = 1*(n-1) = n-1 = (n) 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 6
Sortowanie przez wstawianie Sortowanie odbywa się w n -1 przebiegach. W i-tym przebiegu elementy na pozycjach 1. . . (i-1) są już uporządkowane, a wstawiamy i-ty element przepychając go do przodu na właściwe miejsce, tak by stworzył wraz z innymi ciąg uporządkowany długości i. 4 8 55 3 9 6 4 5 8 33 9 6 4 5 3 8 9 6 i-ty element X Odcinek uporządkowany 2021 -03 -04 4 3 5 8 9 6 3 4 5 8 9 6 G. Mirkowska, ASD 04 Sortowanie itd 7
Schemat algorytmu start e[1]. . . e[i-1] , i < n+2 i : = 2 i < n+1 Nie stop e[ 1]. . . e[i-1] , i<n +1 Tak Umieść e[i] wśród elementów e[1], e[2], . . . e[i-1], przesuwając elementy większe o jedno miejsce w prawo, tak by ciąg i-pierwszych elementów był uporządkowany e[ 1]. . . e[i-2] e[i-1], i<n +2 2021 -03 -04 e[ 1]. . . e[i-1] e[i] , i<n +1 i : = i+1 G. Mirkowska, ASD 04 Sortowanie 8
Algorytm Insertion_sort {for i : = 2 to n do j : = i; pom : = e[i]; e[ 1]. . . e[i-1] e[ 1]. . . e[j-1] pom=e[i], j=i while ( j>1 andif e[j-1]> pom ) do pom< e[ j+1]. . . e[i], e[j] : = e[j-1]; j : = j-1 od; pom <e[j-1] Pom < e[ j] e[j+1]. . . e[i] pom< e[ j+1]. . . e[i] e[ 1] . . . e[j-1] pom< e[ j+1]. . . e[i] e[j] : = pom e[ 1] . . . e[j-1] e[j] < e[ j+1]. . . e[i] od} 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 9
Poprawność sortowania przez wstawianie Algorytm sortowania przez wstawianie poprawnie rozwiązuje problem sortowania w każdej liniowo uporządkowanej strukturze danych. Algorytm sortowania przez wstawianie jest, w każdej liniowo uporządkowanej strukturze danych, całkowicie poprawny ze względu na warunek początkowy n>0 i warunek końcowy ( 1<i n) e[i-1] e[i]. 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 10
Koszt sortowania przez wstawianie Operacja dominująca - porównywanie elementów. W(n) = i=2. . . n (koszt maksymalny pętli wewnętrznej) = i=2. . . n (i-1) = n(n-1)/2 = O(n 2) Element pom z prawdopodobieństwem 1/i może zająć dowolną z pozycji od 1 do i. A(n) = i=2. . . n (koszt średni pętli wewnętrznej)= = i=2. . . n ( j=1. . . i j*(1/i)) = i=2. . . n (1/i)(i (i+1))/2 = (n+1)(n+2)/4 - 1. 5 = (1/4)n 2 +O(n) 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 11
Sortowanie przez scalanie (1) Dzielimy zadanie posortowania całego ciągu na dwa podzadania: posortowania jego lewej i prawej połowy. (2) Gdy obie części tworzą już ciągi uporządkowane, wtedy scalamy je otrzymując rozwiązanie. 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 12
Przykład 16 5 12 4 10 6 1 13 15 7 1 14 9 3 8 11 16 5 12 4 10 6 1 13 5 16 4 12 6 10 1 13 4 5 12 16 15 7 1 14 9 3 8 11 1 6 10 13 1 4 5 6 10 12 13 16 1 3 7 8 9 11 14 15 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 13
Operacja scalania Dane są dwa ciągi X i Y, uporządkowane niemalejąco, x 1, . . . xn i y 1, . . . ym. Utworzyć ciąg e=e 1, . . . e n+m złożony z elementów obu ciągów uporządkowany niemalejąco. Wp = {n>0 m>0, x 1. . . xn i y 1. . . ym } Wk = { e 1. . . en+m , ( i n+m)( j)( ei= xj lub ei = yj)} 2 4 5 8 9 1 2021 -03 -04 2 1 3 6 7 3 4 5 6 G. Mirkowska, ASD 04 Sortowanie 7 8 9 14
Algorytm scalania {i: =1; j : = 1; k : =1, while (i n and j m) do if x[i]< y[j] then e[k] : = x[i]; i : = i +1 else e[k] : = y[j]; j : = j +1 fi; k : = k+1; {k= i+j-1, e[1]. . . e[k-1] i wszystkie elementy x[1], . . . , x[i-1] oraz y[1], . . . , y[j-1] zostały już umieszczone na pozycjach od 1 do k-1 w ciągu e. } od; O(n+m) 2021 -03 -04 if ( j > m) then for i : = i to n do e[k] : = x[i]; k : = k+1 od Else for j : = j to m do e[k] : = y[j]; k : = k+1 od} G. Mirkowska, ASD 04 Sortowanie 15
Specyfikacja procedury scal(k, x, l) Wersja procedury scal (lewy, x, prawy) użyta w algorytmie Sortowania przez scalanie ma następującą specyfikację Wp = {lewy x prawy e[lewy] e[lewy+1] … e[x] e[x+1] e[x+2] … e[prawy]} Wk = {e[lewy] e[lewy+1] … e[x] e[x+1] … e[prawy] } Twierdzenie (*) Procedura scal(k, x, l) zastosowana do dowolnego ciągu e[1], . . . , e[n] jest całkowicie poprawna ze względu na podaną wyżej specyfikację. 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 16
Sortowanie przez scalanie Jeśli lewy = prawy, to jest tylko jeden element w naszym ciągu. procedure MS(lewy, prawy : integer); begin W tym wywołaniu rozważamy if prawy>lewy then lewą „połowę” danego ciągu x : = (lewy+ prawy) div 2; MS(lewy, x); Z założenia indukcyjnego : e[lewy] . . . e[x] MS(x+1, prawy); Z założenia indukcyjnego : e[x+1] . . . e[prawy] scal (lewy, x, prawy) Na mocy Tw (*) : e[lewy] . . . e[prawy] fi end MS; 2021 -03 -04 W tym wywołaniu rozważamy prawą „połowę” danego ciągu G. Mirkowska, ASD 04 Sortowanie 17
Koszt algorytmu Merge_Sort Załóżmy, że n = 2 p. wtedy T(n) = T(n/2) + cn T(1) = 0 Po podstawieniu mamy T(2 0) = 0 T(2 p) = 2 T(2 p-1) +c n T(2 p ) = 2 T(2 p-1) + c 2 p = 2(2 T(2 p-2) +c 2 p-1) + c 2 p = 2 2 T(2 p-2 ) + c 2 p =. . . = 2 p T(2 0 ) + cp 2 p = ( n lg n) T(n) = (n lg (n)) 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 18
Szybkie sortowanie Metoda : Krok 1. Rozdzielić elementy danego ciągu e 1, e 2, . . . , en na dwie części względem pewnego ustalonego elementu, tzw. mediany, tak by a lewo od niego znajdowały się elementy mniejsze, a na prawo elementy większe. Krok 2. Posortować elementy na lewo od mediany. Krok 3. Posortować elementy znajdujące się na prawo od mediany. 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 19
Przykład wykonania split 10 5 7 8 14 12 3 4 1 Rozdzielanie ze względu na wybraną medianę Stosujemy rekurencyjnie tę samą zasadę do obu części 2021 -03 -04 5 7 8 1 4 3 3 4 1 1 5 3 4 1 3 4 8 7 7 5 10 12 14 8 7 8 10 12 14 G. Mirkowska, ASD 04 Sortowanie 20
Sortowanie szybkie - algorytm Dane: n>0, ciąg e[1], . . . , e[n]. lewy prawy procedure QS(lewy, prawy) {if (prawy > lewy) then Split (lewy, prawy, j); {e[lewy], . . . , e[j-1]}< e[j] {e[j+1], . . . , e[prawy]} QS(lewy, j-1); e[lewy] . . . e[j-1] e[j] {e[j+1], . . . , e[prawy]} fi } 2021 -03 -04 QS(j+1, prawy); e[lewy] . . . e[j-1] e[j+1] . . . e[prawy] G. Mirkowska, ASD 04 Sortowanie 21
Najgorszy przypadek Koszt pesymistyczny algorytmu Quicksort mierzony liczbą porównań wynosi : W(n) = (n 2) 1 2 3 4 5 6 7 8 9 Jeśli Split jako medianę wybiera zawsze pierwszy element, to w wyniku rozdzielenia, jedna część „młodsza” będzie pusta , a druga „starsza” będzie zawierała o jeden element mniej niż w poprzednim kroku. Koszt Operacji rozdzielania SPLIT dla n elementowego ciągu wynosi n-1 porównań. W(n) = (n-1) +W(n-1)= i=2. . . n (i-1) = (n 2) 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie 22
Koszt średni Zakładamy, że wszystkie ustawienia elementów w ciągu i każdy podział w wyniku Split są jednakowo prawdopodobne. Koszt średni algorytmu Quick. Sort, mierzony liczbą porównań, wynosi A(n) = (n lg n) 1 j-1 j n n-j A(n) = (n-1) + j=1. . . n (1/n (A(j-1) + A(n-j))) A(0) = 0 A(n) = (n-1) + j=1. . . n-1 A(j) 2/n 2021 -03 -04 G. Mirkowska, ASD 04 Sortowanie A(n)=cn lg n 23
- Slides: 23