SORTOWANIE 1
SORTOWANIE Proces ustawiania zbioru elementów w określonym porządku. Stosuje się w celu ułatwienia późniejszego wyszukiwania elementów sortowanego zbioru. 2
Definicja Ciąg wejściowy: a 1, a 2,, a n-1, a n Funkcja uporządkowująca: f Sortowanie polega na: f(a 1 ) f(a 2 ) f(a n ) 3
Drzewo decyzji a < b b < c a < c a < b < c a < c b < a < c b < c a < c < b c < a < b b < c < a c < b < a 4
Sortowanie wewnętrzne Sortowane zbiory przechowywane są w szybkiej i o dostępie bezpośrednim, wewnętrznej pamięci komputera. Strukturą danych jest tablica 5
Sortowane zewnętrzne Sortowane zbiory przechowywane są w bardziej powolnej, ale pojemnej, zewnętrznej pamięci komputera w urządzeniach poruszanych mechanicznie. Odpowiednią strukturą danych jest plik. 6
Sortowanie tablic Wszystkie elementy sortowanego zbioru przechowywane są w pamięci. Jeśli algorytm nie tworzy w procesie sortowania dodatkowych tablic pomocniczych, to jest określany sortujący w miejscu. Ocena efektywności algorytmu złożoność: Liczba porównań Liczba przesunięć 7
Sortowanie przez wybieranie 1. wyznaczenie najmniejszego elementu w ciągu; 2. zamiana z pierwszym elementem w ciągu; 3. wyznaczenie najmniejszego elementu w a[2 n]; 4. zamianie go z drugim elementem: 5. wyznaczeniu najmniejszego elementu w a[3 n] 6. zamianie go z trzecim elementem; 7. 8
SORTOWANIE przez wybieranie Ciąg wynikowy: a 1,a 2,,a i-1 Ciąg źródłowy: a i,a i+1,,a n! W każdym kroku od i=1 i kończąc na i=n-1, zwiększając i++ z ciągu źródłowego wybierany jest element najmniejszy i zamieniany z elementem a i. 9
Sortowanie przez wybieranie 4 6 5 1 2 3 1 6 5 4 2 3 1 2 5 4 6 3 1 2 3 4 6 5 1 2 3 4 5 6 kolor -- minimum -- element do zamiany -- element zamieniony -- element poprawny! 1 2 3 4 5 6 10
Schemat blokowy Kolejna iteracja kolejny wiersz Szukanie min Zamiana elementów 11
Pętla wewnętrzna - szukanie min i=0, min=tab[0] i++ N i<n T! min>tab[i] T min=tab[i] N 12
Sortowanie przez wybieranie - kod int main(int argc, char* argv[]) { int t[6]={3,55,4,1,2,9}; const int n=6; int k,min;! for(int i=0; i<n-1; i++) { k=i; min=t[i]; for(int j=i+1; j<n; j++) { if(t[j]<min) { k=j; min=t[j]; } } t[k]=t[i]; t[i]=min; } PRZESTAWIENIA PORÓWNANIA MIN 3(n-1) (n 2 -n)/2 ŚR.? (n 2 -n)/2 MAX (n 2 /4)+ 3(n-1) (n 2 -n)/2 13
Podsumowanie sortowanie przez wybieranie mała ilość przestawień równa liczbie elementów-1 duża liczba porównań; 14
Sortowanie bąbelkowe Sortowanie bąbelkowe polega na przeglądaniu od końca/początku sortowanej tablicy i zamianie miejscami elementów jeśli są one w kolejności odwrotnej tj. pierwszy jest mniejszy od drugiego.! Po zakończeniu pierwszego przejścia element najmniejszy powinien się znajdować na odpowiednim dla niego miejscu czyli na początku tablicy. 15
Sortowanie przez zamianę - bąbelkowe Powtarzane są przejścia przez tablicę przesuwając za każdym razem najmniejszy/ największy z pozostałych elementów na wybrany koniec tablicy. 16
Bąbelki 17
Sortowanie bąbelkowe c.d. { int t[6]={3,55,455,1,2,9}; const int n=6; int k,min,tmp;! for(int i=1; i<n; i++) { for(int j=n-1; j>=i; j--) { if(t[j]<t[j-1]) { tmp=t[j]; t[j]=t[j-1]; t[j-1]=tmp; } } } PRZESTAWIENIA PORÓWNANIA MIN 0 (n 2 -n)/2 ŚR. 3(n 2 -n)/4 (n 2 -n)/2 MAX 3(n 2 -n)/2 (n 2 -n)/2 Przemiatanie tablicy Analiza 2 elementów sąsiadujących ze sobą 18
przykład 19
Uwagi sortowanie bąbelkowe częste puste przebiegi; wrażliwość na konfiguracje danych;! 4 2 6 18 20 39 40 4 6 18 20 39 40 2! Ulepszenia: Zapamiętywanie indeksu ostatniej zamiany; Przełączenie kierunków przeglądania tablicy 20
poprawa Sprawdzić czy dokonano jakiejkolwiek zmiany, jeżeli nie zakończyć algorytm;! Zapamiętanie indeksu ostatniej zmiany i przeprowadzenie następnego przebiegu tylko do tego indeksu. 21
Sortowanie przez wytrząsanie shaker-sort shaker.cpp 22
Sortowanie przez wstawianie Ciąg wynikowy: a 1,a 2,,a i-1 Ciąg źródłowy: a i,a i+1,,a n! Począwszy od i=2 i zwiększając i o 1 i-ty element ciągu źródłowego przenosi się do ciągu wynikowego wstawiając go w odpowiednim miejscu. 23
Proces szukania miejsca w zbiorze wynikowym Znalezienie elementu a j-1 mniejszego niż a i. Osiągnięto lewy koniec ciągu wynikowego. 24
Pseudokod for j! 2 to length(tab) do k! tab[j] i!j-1 while i>0 and tab[i] > k do tab[i+1]! tab[i] i! i-1 tab[i+1]!k tab[1 j-1] " karty w ręce tab[j+1 n] " karty na stole 25
26
Sortowanie typu: Dziel i zwyciężaj 27
Struktura rekurencyjna W celu rozwiązania danego problemu algorytmu wywołuje sama siebie przy rozwiązaniu podobnych problemów (silnia).! Metoda dziel i zwyciężaj. Problem jest dzielony na kilka mniejszy problemów podobnych do siebie.! Problemy te rozwiązywane są rekurencyjnie a następnie rozwiązania są łączone w celu rozwiązania całego problemu. 28
Etapy metody dziel i zwyciężaj DZIEL: dzielimy problemu na mniejsze. ZWYCIĘŻAJ: rozwiązujemy podproblemy rekurencyjnie POŁĄCZ: łączymy rozwiązania podproblemów, aby otrzymać 29
Dziel i zwyciężaj (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. 30
Rekurencyjne dzielenie i scalanie Dzielenie: 74289721 72971 4872 791 27 47 82 71 9 2 7 4 7 8 2 7 1 31
Rekurencyjne dzielenie i scalanie Scalanie: 122477789 12779 2478 179 27 47 28 17 9 2 7 4 7 8 2 7 1 O(n+m) 32
Algorytm sortowanie przez scalanie Dziel " Dzielimy n-elementów ciąg na dwa podciągi po n/2 elementów każdy. Zwyciężaj " Sortujemy otrzymane podciągi, używając rekurencyjnie sortowania przez scalanie Połącz " Łączymy posortowane podciągi w jeden ciąg. 33
Operacja sortowania przez scalanie 34
35
36
Sortowanie przez podział Podział; Sortowanie podciągów otrzymanych w wyniku podziału; 37
WNIOSKI sortowanie przez wybieranie jest łatwym, ale wolnym sposobem sortowania; sortowanie przez scalanie jest szybszym, ale tez bardziej skomplikowanym algorytmem. algorytm sortowania przez wybieranie ~ O(n 2 ), algorytm sortowania przez scalanie ~ O(n log n). 38
http://www.cs.ubc.ca/spider/harrison/java/ sorting-demo.html 39