1 / 23

ASD Algorytmy sortujące

ASD Algorytmy sortujące. Marcin Mikołajczyk s3749 marcin@pjwstk.edu.pl. 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).

avari
Download Presentation

ASD Algorytmy sortujące

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ASDAlgorytmysortujące Marcin Mikołajczyk s3749 marcin@pjwstk.edu.pl

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

  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 mniejszymUwaga: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żepowodować niewłaściwe działanie w przypadku niektórychdanych)

  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 wykorzystaniemetody ”dziel izwycięż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) • Czas sortowania tablicy uporządkowanej • Czas sortowania tablicy odwrotnie uporządkowanej

  20. Quick Sort vs. Merge Sort (porównanie) • Średni czas sortowania • Średnia liczba wykonanych zmian

  21. Quick Sort vs. Merge Sort (porównanie) • Średnia liczba wykonanych porównań

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

  23. Dziękuję za uwgę! http://pjwstk.nevada.pl

More Related