Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

ASD Algorytmy sortujące Marcin Mikołajczyk s3749

Podobne prezentacje


Prezentacja na temat: "ASD Algorytmy sortujące Marcin Mikołajczyk s3749"— Zapis prezentacji:

1 ASD Algorytmy sortujące Marcin Mikołajczyk s3749

2 Algorytmy sortujące Insertion Sort (sort. przez wstawianie) 1 Quick Sort (sort. szybkie) Merge Sort (sort. przez scalanie) Quick Sort vs. Merge Sort (porównanie) 2 3 4

3 Insertion Sort (sort. przez wstawianie) Algorytm polegający na usuwaniu pewnego elementu z danych wejściowych i wstawianiu go na odpowiednie miejsce w wynikach. Wybór następnego elementu z danych jest dowolny. Szybkość tego algorytmu zależy od struktury danych wyjściowych i implementacji operacji wstawiania. Złożoność obliczeniowa: O(n ² )

4 Insertion Sort (sort. przez wstawianie) Zalety algorytmu: szybkość sortowania już posortowanych lub prawie posortowanych elementów efektywny dla zbiorów o niewielkiej liczebności stabilny prosty do interpretacji Wada algorytmu: wymaga dodatkowej pamięci komputera

5 Insertion Sort (sort. przez wstawianie) Zasada działania Utwórz zbiór elementów posortowanych i przenieś do niego dowolny element ze zbioru nieposortowanego. Weź dowolny element ze zbioru nieposortowanego. Wyciągnięty element porównuj z kolejnymi elementami zbioru posortowanego póki nie napotkasz elementu równego lub elementu większego (jeśli chcemy otrzymać ciąg niemalejący) lub nie znajdziemy się na początku/końcu zbioru uporządkowanego. Wyciągnięty element wstaw w miejsce gdzie skończyłeś porównywać. Jeśli zbiór elementów nieuporządkowanych jest niepusty wróć do punkt 2.

6 Insertion Sort (sort. przez wstawianie) Przykład Problem można dobrze zilustrować na przykładzie układania kart. Wyobraź sobie, że trzymasz w ręku 5 kart o "wartościach": 5, 2, 4, 7, 3. Przekładamy teraz do drugiej ręki pierwszą kartę - czyli 5. W I ręce mamy: 2, 4, 7, 3. W drugiej: 5. Znowu przekładamy pierwszą kartę. Trzeba ją włożyć do drugiej ręki w odpowiednie miejsce! W I ręce mamy: 4, 7, 3. W drugiej: 2, 5. Potem bierzemy kartę 4....i wkładamy ją do drugiej ręki w odpowiednie miejsce (trzeba je WYSZUKAĆ). W I ręce mamy: 7, 3. W drugiej: 2, 4, 5. Teraz 7. W I ręce mamy: 3. W drugiej: 2, 4, 5, 7. I na koniec bierzemy: 3. W I ręce mamy: [pusto]. W drugiej: 2, 3, 4, 5, 7. Jak widać jest to bardzo prosty rodzaj sortowania. W takiej postaci można go w prosty sposób stosować do sortowania list. W przypadku tablic insertion-sort wymaga niestety przesuwania wielu elementów tablicy, dlatego jest dosyć czasochłonny.

7 Insertion Sort (sort. przez wstawianie) Pseudokod for k = 2 to n do // k to początek zbioru nieposortowanego element = A[k] i = k-1 while( i>0 )and( A[i]>element ) do //szukamy miejsca i tworzymy rozstęp A[i+1] = A[i] //przesuwamy elementy i = i-1 a[i+1] = element //wstawiamy element tuz za mniejszym Uwaga: W pętli while przesuwamy elementy, dopóki są większe niż pamiętany element. Kiedy pętla się zakończy, wstawiamy pamiętany element w A[i+1] - będzie to miejsce po mniejszym i przed większym elementem, ewentualnie początek lub koniec (zbioru posortowanego [1..k])

8 Quick Sort (sort. szybkie) Quick Sort jest najlepszą z poznanych dotychczas metod sortowania. Jest ona metodą typu divide and conquer (dziel i rządź). Złożoność obliczeniowa: O(nlogn), jednak przy złym wyborze piwota i niekorzystnych danych wejściowych może wynieść Θ (n ² )

9 Quick Sort (sort. szybkie) Zalety algorytmu: działa prawie w miejscu (używając niewielkiego stosu pomocniczego) ma wyjątkowo skromna pętlę wewnętrzną Wady algorytmu: jest niestabilny jest wrażliwy (czasami prosty niezauważony błąd w implementacji może powodować niewłaściwe działanie w przypadku niektórych danych)

10 Quick Sort (sort. szybkie) Zasada działania Metoda tego algorytmu polega na dzieleniu sortowanego ciągu na odpowiednio wybrane podciągi i dla każdego z otrzymanych podciągów (z ilością elementów >= 2) wywołaniu (rekurencyjnym) ponownie samej siebie. Bardziej szczegółowo: Dla danego ciągu najpierw wyznaczany jest tzw. znacznik podziału. Może on być wybierany na różne sposoby. Najczęstszymi sposobami wyboru znacznika podziału są: element wzięty ze środka ciągu; element wylosowany spośród elementów ciągu; mediana kilku elementów wybranych lub wylosowanych z ciągu. Następnie QS porządkuje ciąg w ten sposób, by w pierwszej jego części znalazły się tylko elementy <= x (pierwszy podciąg), potem ewentualnie jeden element = x (drugi podciąg), a potem elementy >= x (trzeci podciąg). Każdy z tych podciągów może być pusty (ale oczywiście nie wszystkie naraz). Następnie jeśli pierwszy podciąg zawiera co najmniej 2 elementy, to ten podciąg też trzeba uporządkować (jego dane, czyli początek i koniec, trafiają na stos). Podobnie dzieje się dla podciągu trzeciego. Całość jest powtarzana aż do momentu, gdy wszystkie podciągi będą uporządkowane (stos będzie pusty), czyli aż cały wyjściowy ciąg będzie posortowany.

11 Quick Sort (sort. szybkie) Pseudokod połóż na stos (1, n) dopóki stos niepusty rób zdejmij ze stosu (L, P) i := L; k := P; x := tab[(L + P) div 2] //x to znacznik podziału dopóki i <= k rób dopóki tab[i] < x rób i := i + 1 dopóki tab[k] > x rób k := k - 1 jeśli i <= k zamień tab[i] z tab[k] i := i + 1; k := k - 1 jeśli L < k połóż na stos (L, k) jeśli i < P połóż na stos (i, P)

12 Merge Sort (sort. przez scalanie) Jest to algorytm typu dziel i rządź. Ideą działania tego typu algorytmów jest podział problemu na mniejsze części, których rozwiązanie jest już łatwiejsze. Złożoność obliczeniowa: O(nlogn), jednak wymaga O(n) dodatkowej pamięci

13 Merge Sort (sort. przez scalanie) Zalety algorytmu: złożoność jest zawsze taka sama, niezależnie od danych wejściowych (czasami może to jednak być wadą) jest stabilny Wady algorytmu: najdłużej trwa sortowanie zbioru nieuporządkowanego

14 Merge Sort (sort. przez scalanie) Scalanie lub zestawianie oznacza łączenie dwóch lub więcej uporządkowanych zbiorów w jeden uporządkowany. Najprościej wykonać tę operację porównując najmniejsze elementy obu zbiorów, a następnie usuwając mniejszy, zapisawszy go uprzednio do zbioru wyjściowego. Okazuje się, że podany algorytm jest najskuteczniejszą metodą scalania, o ile scalane ciągi są podobnej długości. Jeżeli jeden z wejściowych ciągów jest znacznie dłuższy od drugiego, można podać lepsze algorytmy.

15 Merge Sort (sort. przez scalanie) Zasada działania Podobnie jak omawiany wcześniej Quick Sort, sortowanie przez scalanie jest przedstawicielem rodziny dziel i zwyciężaj. Sortowanie odbywa się przez podzielenie wejściowego ciągu na dwie równe części, posortowaniu każdej z nich i scaleniu za pomocą opisanej wcześniej metody. Zauważmy, że proces dzielenia kolejnych podtablic można kontynuować do momentu, gdy staną się jednoelementowe. Ponieważ ciągi jednoelementowe są uporządkowane, więc można dla nich wykonać procedurę scalania opisaną powyżej. Ilustrację sortowania przez scalanie stanowi rysunek.

16 Merge Sort (sort. przez scalanie) Etapy sortowania

17 Merge Sort (sort. przez scalanie) Pseudokod (A,p,r) jeśli p < r to { q := [p+r/2]; Merge sort(A, p, q); Merge sort(A, q + 1, r); Merge(A, p, q, r) } Algorytm przez scalanie powstaje przez wykorzystanie metody dziel i zwyciężaj do projektowania algorytmu. Stąd składa się z trzech procedur: Dziel: ciąg n-elementowy na dwa [n/2] elementowe; Zwyciężaj: sortuj każdy z otrzymanych podciągów (Merge-sort); Połącz: oba posortowane ciągi w jeden (Merge).

18 Quick Sort vs. Merge Sort (porównanie) Szczegółowym testom poddanych zostało pięć algorytmów sortujących: BubbleSort sortowanie przez prosty wybór, HeapSort, QuickSort oraz MergeSort. W dalszej części prezentacji porównam dwa ostatnie. Do sprawdzenia wydajności algorytmów w praktyce użyto specjalnie przygotowaniej aplikacji, napisanej w środowisku Borland C++ Builder 6.0 Personal Edition. Test polegał na wykonaniu dwudziestu sortowań dla każdej długości tablicy. Pod uwagę brane były trzy elementy: czas działania, ilość wykonanych zamian oraz ilość porównań porządkowanych elementów.

19 Quick Sort vs. Merge Sort (porównanie) algorytm il. elementów Quick Sort 5,866E-62,542E-50,00020,00330,07420,7405 Merge Sort 1,732E-58,101E-50,00080,10270,16251,9224 Czas sortowania tablicy uporządkowanej Czas sortowania tablicy odwrotnie uporządkowanej algorytm il. elementów Quick Sort 6,42E-62,82E-50,00020,00440,05750,7866 Merge Sort 1,704E-58,8E-50,00090,01220,17182,382

20 Quick Sort vs. Merge Sort (porównanie) algorytm il. elementów Quick Sort 7,123E-65,49E-50,00070,0095 Merge Sort 1,771E-59,886E-50,00120,015 Średni czas sortowania Średnia liczba wykonanych zmian algorytm il. elementów Quick Sort 11,4183,22507,832164,05 Merge Sort 19,3196,81974,419749,4

21 Quick Sort vs. Merge Sort (porównanie) algorytm il. elementów Quick Sort 17,8472,258038, ,0 Merge Sort 8,0593,4948,29498,3 Średnia liczba wykonanych porównań

22 Literatura Niniejsza prezentacja powstała m.in. w oparciu o poniższe materiały: L. Banachowski, K.Diks, W.Rytter Algorytmy i struktury danych, Wydawnictwa Naukowo-Techniczne, Warszawa 1996, 2001

23


Pobierz ppt "ASD Algorytmy sortujące Marcin Mikołajczyk s3749"

Podobne prezentacje


Reklamy Google