ASD Algorytmy sortujące

23
ASD Algorytm y sortując e Marcin Mikołajczyk s3749 [email protected] l

description

ASD Algorytmy sortujące. Marcin Mikołajczyk s3749 [email protected]. 1. 3. 2. 4. Algorytmy sortujące. Insertion Sort (sort. przez wstawianie). Quick Sort (sort. szybkie). Merge Sort (sort. przez scalanie). Quick Sort vs. Merge Sort (porównanie). - PowerPoint PPT Presentation

Transcript of ASD Algorytmy sortujące

Page 1: ASD Algorytmy sortujące

ASD

Algorytmysortujące

Marcin Mikołajczyk s3749 [email protected]

Page 2: ASD Algorytmy sortujące

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

Page 3: ASD Algorytmy sortujące

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²)

Page 4: ASD Algorytmy sortujące

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

Page 5: ASD Algorytmy sortujące

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.

Page 6: ASD Algorytmy sortujące

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.

Page 7: ASD Algorytmy sortujące

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])

Page 8: ASD Algorytmy sortujące

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²)

Page 9: ASD Algorytmy sortujące

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)

Page 10: ASD Algorytmy sortujące

Quick Sort (sort. szybkie)

Zasada działania

Metoda tego algorytmu polega na dzieleniu sortowanego ciągu na odpowiednio wybranepodcią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 naróż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ę tylkoelementy <= x (pierwszy podciąg), potem ewentualnie jeden element = x (drugi podciąg), apotem elementy >= x (trzeci podciąg). Każdy z tych podciągów może być pusty (ale oczywiścienie wszystkie naraz). Następnie jeśli pierwszy podciąg zawiera co najmniej 2 elementy, to tenpodcią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, gdywszystkie podciągi będą uporządkowane (stos będzie pusty), czyli aż cały wyjściowy ciągbędzie posortowany.

Page 11: ASD Algorytmy sortujące

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)

Page 12: ASD Algorytmy sortujące

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

Page 13: ASD Algorytmy sortujące

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

Page 14: ASD Algorytmy sortujące

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.

Page 15: ASD Algorytmy sortujące

Merge Sort (sort. przez scalanie)

Zasada działania

Podobnie jak omawiany wcześniej Quick Sort, sortowanieprzez scalanie jest przedstawicielem rodziny dziel i zwyciężaj.Sortowanie odbywa się przez podzielenie wejściowego ciąguna dwie równe części, posortowaniu każdej z nich i scaleniuza pomocą opisanej wcześniej metody. Zauważmy, że procesdzielenia kolejnych podtablic można kontynuować domomentu, gdy staną się jednoelementowe. Ponieważ ciągijednoelementowe są uporządkowane, więc można dla nichwykonać procedurę scalania opisaną powyżej. Ilustracjęsortowania przez scalanie stanowi rysunek.

Page 16: ASD Algorytmy sortujące

Merge Sort (sort. przez scalanie)

Etapy sortowania

Page 17: ASD Algorytmy sortujące

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).

Page 18: ASD Algorytmy sortujące

Quick Sort vs. Merge Sort (porównanie)

Szczegółowym testom poddanych zostało pięć algorytmówsortujących: BubbleSort sortowanie przez prosty wybór,HeapSort, QuickSort oraz MergeSort. W dalszej częściprezentacji porównam dwa ostatnie.

Do sprawdzenia wydajności algorytmów w praktyce użytospecjalnie przygotowaniej aplikacji, napisanej w środowiskuBorland C++ Builder 6.0 Personal Edition.Test polegał na wykonaniu dwudziestu sortowań dla każdejdługości tablicy. Pod uwagę brane były trzy elementy: czasdziałania, ilość wykonanych zamian oraz ilość porównańporządkowanych elementów.

Page 19: ASD Algorytmy sortujące

Quick Sort vs. Merge Sort (porównanie)

algorytm il. elementów 10 102 103 104 105 106

Quick Sort 5,866E-6 2,542E-5 0,0002 0,0033 0,0742 0,7405

Merge Sort 1,732E-5 8,101E-5 0,0008 0,1027 0,1625 1,9224

Czas sortowania tablicy uporządkowanej

Czas sortowania tablicy odwrotnie uporządkowanej

algorytm il. elementów 10 102 103 104 105 106

Quick Sort 6,42E-6 2,82E-5 0,0002 0,0044 0,0575 0,7866

Merge Sort 1,704E-5 8,8E-5 0,0009 0,0122 0,1718 2,382

Page 20: ASD Algorytmy sortujące

Quick Sort vs. Merge Sort (porównanie)

algorytm il. elementów 10 102 103 104

Quick Sort 7,123E-6 5,49E-5 0,0007 0,0095

Merge Sort 1,771E-5 9,886E-5 0,0012 0,015

Średni czas sortowania

Średnia liczba wykonanych zmian

algorytm il. elementów 10 102 103 104

Quick Sort 11,4 183,2 2507,8 32164,05

Merge Sort 19,3 196,8 1974,4 19749,4

Page 21: ASD Algorytmy sortujące

Quick Sort vs. Merge Sort (porównanie)

algorytm il. elementów 10 102 103 104

Quick Sort 17,8 472,25 8038,85 106970,0

Merge Sort 8,05 93,4 948,2 9498,3

Średnia liczba wykonanych porównań

Page 22: ASD Algorytmy sortujące

Literatura

Niniejsza prezentacja powstała m.in. w oparciu o poniższe materiały:

http://edukacja.pwsz.pila.pl/~ochodek/sortowania/ http://www.i-lo.tarnow.pl/edu/inf/alg/algsort/index.html http://si.ae.krakow.pl/~kurdziew/cpp/domowe/dodatkowe/algsort/ http://pl.wikipedia.org/wiki/Sortowanie L. Banachowski, K.Diks, W.Rytter Algorytmy i struktury danych,

Wydawnictwa Naukowo-Techniczne, Warszawa 1996, 2001

Page 23: ASD Algorytmy sortujące

http://pjwstk.nevada.pl