Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Algorytmy i Struktury Danych Sortowanie WYKŁAD 4 PROWADZĄCY: DR PAWEŁ DROZDA.

Podobne prezentacje


Prezentacja na temat: "Algorytmy i Struktury Danych Sortowanie WYKŁAD 4 PROWADZĄCY: DR PAWEŁ DROZDA."— Zapis prezentacji:

1 Algorytmy i Struktury Danych Sortowanie WYKŁAD 4 PROWADZĄCY: DR PAWEŁ DROZDA

2 Treść wykładu Problem sortowania Sortowanie przez wstawianie (Insertion sort) bąbelkowe (Bubble sort) przez wybór (Selection sort) przez scalanie (Merge sort) szybkie (Quick sort) Przez kopcowanie Przez zliczanie (CountingSort) Pozycyjne (Radix sort)

3 Opis problemu Ciąg elementów e={e 1,...,e n } należących do liniowo uporządkowanej przestrzeni Permutacja i 1,...,i n liczb 1,...,n taka, że e i1... e in 5 3 2 4 6 1 31 2 3 3 4 5 6 6, 3, 2, 7, 4, 1, 5 6, 3, 7, 2, 4, 1, 5

4 Sortowanie przez wstawianie Algorytm sortowania InsertionSort(A) for j:=2 to length(A) begin key:=A[j] /* Wstaw A[j] w posortowany ciąg A[1..j-1].*/ i:= j-1 while i>0 i A[i] > key do begin A[i+1] := A[i] i:= i-1 end A[i+1] := key end Przykład działania algorytmu 5 2 4 6 1 3 2 5 4 6 1 3 2 4 5 6 1 3 1 2 4 5 6 3 1 2 3 4 5 6

5 Sortowanie przez wstawianie Sortowanie w miejscu Czas działania algorytmu niech n = length(A) pętla for: n-1 razy pętla while: optymistycznie: 1 przesunięcie pesymistycznie: n-1 przesunięć średnio: (n-1)/2 przesunięć Złożoność: O(n 2 ) sortowanie przyrostowe

6 Sortowania bąbelkowe Algorytm sortowania BubbleSort(A) n :=length(A) for i :=1 to n-1 begin for j:=n downto i+ 1 begin if A[j] { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.pl/2/812817/slides/slide_6.jpg", "name": "Sortowania bąbelkowe Algorytm sortowania BubbleSort(A) n :=length(A) for i :=1 to n-1 begin for j:=n downto i+ 1 begin if A[j]

7 Sortowania bąbelkowe Sortowanie w miejscu, przyrostowe Czas działania algorytmu pętla for i: n-1 razy pętla for j: średnio n/2 razy (nawet jeżeli warunek nie jest spełniony) Złożoność: O(n 2 ) Najgorszy przypadek: ciąg posortowany odwrotnie

8 Sortowania bąbelkowe Usprawnienia: zmiana kierunku bąbelków – Shake sort / Coctail sort Sortowanie grzebieniowe (Comb sort) rozpiętość = n/1.3 (wyznaczone empirycznie) sortuj kolejno wszystkie pary obiektów odległych o rozpiętość podziel rozpiętość przez 1.3 i wykonuj ponownie powyższe sortowanie do czasu, gdy rozpiętość osiągnie wartość 1 Złożoność: prawdopodobnie O(nlogn)

9 Combsort– Przykład dr Paweł Drozda 246807143 143807246 042417386 041427386 014243768 Gap=6 Gap=4 Gap=3 Gap=2 Gap=1012434678 012434678

10 Sortowanie przez wybór Algorytm sortowania SelectionSort(A) n:=length(A) for i:=1 to n-1 begin wybierz najmniejszy element spośród A[i]...A[n] i zamień go miejscami z A[i] end 5 2 4 6 1 3 1 2 4 6 5 3 1 2 3 6 5 4 1 2 3 4 5 6

11 Sortowanie przez wybór Sortowanie w miejscu, przyrostowe Czas działania algorytmu pętla for: n-1 razy wyszukanie najmniejszego elementu: od 1 do n razy, średnio n/2 porównań Złożoność: O(n 2 )

12 Sortowanie przez scalanie Podziel A w połowie na 2 podciągi Kontynuuj dzielenie rekurencyjnie Jeżeli podciągów nie da się już podzielić, scal je sortując Nieposortowany ciąg Pojedyncze elementy Podział Posortowany ciąg Scalanie

13 Sortowanie przez scalanie Algorytm sortowania MergeSort(lo, hi) if lo=hi zakończ m := (lo+hi)/2 MergeSort(lo,m) MergeSort(m+1,hi) Merge(lo,m,hi) Merge(lo, med, hi) i := lo, j := med+1 for k:=1...hi-lo+1 begin if A[i]>A[j] begin A[k] := A[i], i:=i+1 end else begin A[k] := A[j], j:=j+1 end A[lo]...A[hi] := A[1]...A[hi-lo+1] Przykład dla: 5 2 4 6 1 3

14 Sortowanie przez scalanie Dziel i zwyciężaj bazuje na obserwacjach: łatwiej posortować krótszy ciąg niż dłuższy łatwiej otrzymać posortowany ciąg ze złączenia 2 posortowanych podciągów, niż z 2 nieposortowanych podciągów (Merge) z indukcji matematycznej otrzymujemy złożoność O(nlogn) Wymaga (n) dodatkowej pamięci (Merge)

15 Sortowanie szybkie Wybieramy element dzielący p Dzielimy A na 2 podciągi: < p i p Sortujemy niezależnie (rekurencyjnie) te podciągi Dziel i zwyciężaj

16 Sortowanie szybkie Algorytm sortowania QuickSort(lo, hi) if A[lo]...A[hi] zawiera przynajmniej 2 różne wartości begin p:= większa z 2 różnych wartości przestaw elementy w A tak, że dla pewnego k, lo { "@context": "http://schema.org", "@type": "ImageObject", "contentUrl": "http://images.slideplayer.pl/2/812817/slides/slide_16.jpg", "name": "Sortowanie szybkie Algorytm sortowania QuickSort(lo, hi) if A[lo]...A[hi] zawiera przynajmniej 2 różne wartości begin p:= większa z 2 różnych wartości przestaw elementy w A tak, że dla pewnego k, lo

17 Sortowanie szybkie 524613 524613 5 524613 4 23 6 2 1233 546 23 1

18 sortuje w miejscu Złożoność przestawienie elementów – O(n) liczba wywołań rekurencyjnych: średnio: O(log(n)) pesymistycznie O(n) średnia złożoność: O(n log(n)) Najszybszy algorytm sortujący, dobra implementacja będzie 2-3 razy szybsza niż MergeSort

19 Kopiec Inaczej stóg/sterta Drzewo binarne, które zawiera elementy e={e 1,...,e n } należące do liniowo uporządkowanej przestrzeni drzewo zrównoważone drzewo uporządkowane węzeł ma własność kopca gdy: WARTOŚĆ(T,RODZIC(T,n)) WARTOŚĆ(T,n) liście zawsze spełniają własność kopca

20 Kopiec jako tablica wierzchołek wstaw do tab[0] dla i-tego węzła tab[i]: lewe dziecko: tab[2*i+1] prawe dziecko: tab[2*i+2] rodzic: tab[i/2]? 18 1512 109 3 4 1 6 7 0123456789 18151210976431

21 Zamiana wartości: jeżeli węzeł nie spełnia własności kopca, to zamień jego wartość z synem o większej wartośći Syn może utracić własność kopca Z drzewa do kopca 10 1518 1510

22 Konstrukcja kopca dodawaj nową wartość do sterty i sprawdź czy nie została zaburzona własność kopca dla rodzica nowo dodanego węzła jeżeli tak, to rekurencyjnie zamieniaj w górę ZamienWGore(n): r = RODZIC(n) if WARTOŚĆ(n) > WARTOŚĆ (r) begin zamień wartości n i r ZamienWGore(r) end

23 Usunięcie korzenia Wierzchołek kopca zawiera największą wartość Na miejsce korzenia wstaw ostatni węzeł drzewa Rekurencyjnie przywróć własność kopca dla korzenia i jego synów ZamienWDol(n): s = węzeł z większą wartością spośród synów n if WARTOŚĆ(s) > WARTOŚĆ (n) begin zamień wartości n i s ZamienWDol(s) end

24 Sortowanie przez kopcowanie dr Paweł Drozda Utwórz kopiec Dla każdego wierzchołka – zaczynając od wierzchołka n/2 do korzenia kopca przywróć własność kopca Usuwaj po kolei elementy które są korzeniami, aż do momentu dekonstrukcji całego kopca

25 Sortowanie przez kopcowanie - przykład dr Paweł Drozda 4586721 4 8 1267 5 4 8 1265 7 8 4 1265 7 7 4 215 6 6 4 12 5 5 4 1 2 4 12 2 1 1 1245678

26 Sortowanie przez zliczanie Sortowanie bez porównywania elementów Założenie: sortujemy liczby całkowite Idea: ile elementów jest mniejsze od liczby x? 12345678 36413414 123456 202301 12345678123456 224778 11334446

27 CountingSort: for i=1…k do { C[i]=0; } for i=1…n do { C[A[i]]++; } for i=2…k do { C[i] = C[i]+C[i-1]; } for i=n…1 do { B[C[A[i]]] = A[i]; C[A[i]]--; } O(k) O(n) O(k) O(n) Ostatecznie: =O(k)+O(n)+O(k)+O(n) =2(O(k)+O(n)) =2O(k+n)=O(k+n)

28 Sortowanie pozycyjne Herman Hollerith 1884

29 Radix sort Liczby całkowite liczba składa się z d cyfr cyfra przybiera wartości od 0 do k-1 329457657839436720355 0123456789

30 Radix sort Sortujemy po kolejnych cyfrach Sortowanie jest stabilne utrzymuje kolejność występowania dla elementów o tym samym kluczu np. sortowanie rekordu z datą: {d,m,r} Złożoność obliczeniowa: d*O(n+k)


Pobierz ppt "Algorytmy i Struktury Danych Sortowanie WYKŁAD 4 PROWADZĄCY: DR PAWEŁ DROZDA."

Podobne prezentacje


Reklamy Google