Aisd W9

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Aisd W9 as PDF for free.

More details

  • Words: 4,012
  • Pages: 75
Algorytmy i struktury danych Temat: Algorytmy sortowania wewnętrznego

Metody sortowania wewnętrznego Podstawowe algorytmy sortowania Sortowanie przez wstawianie (ang. insertion sort) Sortowanie przez wybieranie (selekcję) (ang. selection sort) Sortowanie przez zamianę (bąbelkowe) (ang. exchange sort, bubble sort) Efektywne algorytmy sortowania Sortowanie przez kopcowanie (ang. heap sort) Sortowanie metodą malejących przyrostów (Shella) Sortowanie szybkie (ang. quicksort) Sortowanie przez scalanie (ang. merge sort)

Klucze początkowe

Algorytmy i struktury danych

44

55

12

42

94

18

06

67 2

Sortowanie przez wstawianie

K r o k i a l g o r y t m u

Klucze początkowe

44

55

12

42

94

18

06

67

i=2

44

55

12

42

94

18

06

67

i=3

12

44

55

42

94

18

06

67

i=4

12

42

44

55

94

18

06

67

i=5

12

42

44

55

94

18

06

67

i=6

12

18

42

44

55

94

06

67

i=7

06

12

18

42

44

55

94

67

i=8

06

12

18

42

44

55

67

94

Algorytmy i struktury danych

3

Idea algorytmu sortowania przez wstawianie void InsertionSort (int tab[ ], int n) { for ( i=1; i
Algorytmy i struktury danych

4

Przykładowy algorytm sortowania przez wstawianie void InsertionSort (int tab[ ], int n) { for ( int i=1, j; i0 && temp
Algorytmy i struktury danych

5

Sortowanie przez wybieranie

44

55

12

42

94

18

06

67

06

55

12

42

94

18

44

67

i=3

06

12

55

42

94

18

44

67

i=4

06

12

18

42

94

55

44

67

i=5

06

12

18

42

44

55

94

67

i=6

06

12

18

42

44

55

67

94

Klucze K r początkowe o i=2 k i

a l g o r y t m u

Algorytmy i struktury danych

6

Idea algorytmu sortowania przez wybieranie void SelectionSort (int tab[ ], int n) { for (i=0; i
Algorytmy i struktury danych

7

Przykładowy algorytm sortowania przez wybieranie void SelectionSort (int tab[ ], int n) { for (int i=0, least, j; i
8

Przykładowy algorytm sortowania przez wybieranie void SelectionSort (int tab[ ], int n) ??? { for (int i=0, least, j; i
9

Sortowanie przez zamianę (bąbelkowe) Kroki Klucze i=2 początkowe

algorytmu

i=3

i=4

i=5

i=6

i=7

i=8

44

06

06

06

06

06

06

06

55

44

12

12

12

12

12

12

12

55

44

18

18

18

18

18

42

12

55

44

42

42

42

42

94

42

18

55

44

44

44

44

18

94

42

42

55

55

55

55

06

18

94

67

67

67

67

67

67

67

67

94

94

94

94

94

Algorytmy i struktury danych

10

Idea algorytmu sortowania przez zamianę void BubbleSort (int tab[ ], int n) { for (i=0; ii; j−−) jeśli kolejność elementów j oraz j-1 jest niewłaściwa, zamień je miejscami; }

Algorytmy i struktury danych

11

Przykładowy algorytm sortowania przez zamianę void BubbleSort (int tab[ ], int n) { for (int i=0; ii; j−− −−) −− if (tab[j]
Algorytmy i struktury danych

12

Sortowanie mieszane Kroki

Klucze początkowe i=2

algorytmu

i=3

i=4

44

06

06

06

06

55

44

44

12

12

12

55

12

44

18

42

12

42

18

42

94

42

55

42

44

18

94

18

55

55

06

18

67

67

67

67

67

94

94

94

Algorytmy i struktury danych

13

Przykładowy algorytm sortowania mieszanego void ShakeSort (int tab[ ], int n) { int left=0, right=n-1, k=n-1; do { for (int j= right; j>left; j−− −−) −− if (tab[j-1]>tab[j ]) { zamiana (tab[j −1], tab[j ]); k=j; } left=k+1; for (j= left; jtab[j ]) { zamiana (tab[j −1], tab[j ]); k=j; } right=k-1; } while (left
14

ZłoŜoność obliczeniowa algorytmów sortowania



Sortowanie przez wstawianie przypadek optymistyczny: dane są właściwie posortowane

void InsertionSort (int tab[ ], int n) { n -1 for ( int i=1, j; i0 && temp




} n - liczba elementów w tablicy, TO - liczba porównań związanych z tab, TR - liczba przypisań związanych z tab Algorytmy i struktury danych

15

ZłoŜoność obliczeniowa algorytmów sortowania 

Sortowanie przez wstawianie Przypadek pesymistyczny: dane są posortowane w odwrotnej kolejności

n −1 i n −1 void InsertionSort (int tab[ ], int n) TOmax = 1 = i = 1 + 2 + ... + n − 1 = { i =1 j =1 i =1 for ( int i=1, j; i0 && temp
∑∑



}

Algorytmy i struktury danych







= 2(n − 1) + 1 + 2 + ... + n − 1 = n(n − 1) = 2(n − 1) + = 0,5 (n2 + 3 n - 4) = O(n 2 ) 2 16

ZłoŜoność obliczeniowa algorytmów sortowania



Sortowanie przez wstawianie Przypadek „średni”

TOśr = 0.25 (n2 + n - 2)

  

TRśr = 0.25 (n2 + 5n - 6)

n - ilość elementów w tablicy, TO - liczba porównań klucza, TR - liczba przesunięć elementów w tablicy

Algorytmy i struktury danych

17

ZłoŜoność obliczeniowa algorytmów sortowania, cd.



Sortowanie przez wybieranie Przypadek optymistyczny = przypadek pesymistyczny

void SelectionSort (int tab[ ], int n) n −2 n −1 n −2 TO min = TO max = 1 = ( n −1 − i ) = { i =0 j = i +1 i =0 for (int i=0, least, j; i
∑∑ ∑

Algorytmy i struktury danych

18

ZłoŜoność obliczeniowa algorytmów sortowania, cd.



Sortowanie przez zamianę (bąbelkowe) Przypadek optymistyczny

void BubbleSort (int tab[ ], int TOn) min = TO max = { n −2 n −1 n −2 n( n − 1 ) for (int i=0; i i; j--) if (tab[j]
∑∑

Algorytmy i struktury danych



19

ZłoŜoność obliczeniowa algorytmów sortowania, cd.



Sortowanie przez zamianę (bąbelkowe) Przypadek pesymistyczny

void BubbleSort (int tab[ ], intTO n)min = TO max = { n −2 n −1 n −2 n( n − 1 ) for (int i=0; ii; j--) i =0 j =i if (tab[j]
∑∑

∑∑

i =0 j = i +1

Algorytmy i struktury danych



2

20

ZłoŜoność obliczeniowa algorytmów sortowania, cd.



Sortowanie przez zamianę (bąbelkowe) Przypadek „średni”

TO = 0,5 (n2 - n)

TRśr = 0,75 (n2 - n)

n - ilość elementów w tablicy, TO - liczba porównań klucza, TRi - liczba przesunięć elementów w tablicy

Algorytmy i struktury danych

21

Metody sortowania wewnętrznego

Efektywne algorytmy sortowania  Sortowanie przez kopcowanie (ang. heap sort)  Sortowanie metodą malejących przyrostów (Shella)  Sortowanie szybkie (ang. quicksort)  Sortowanie przez scalanie (ang. merge sort)

Algorytmy i struktury danych

22

Sortowanie drzewiaste 94

94

55 55

44

42

55

Tablica wynikowa:

12

94

42

...

94

67

18

06

67

94

Wyznaczenie największego klucza poprzez wielokrotny wybór Algorytmy i struktury danych

23

Sortowanie drzewiaste

55 55

44

42

55

Tablica wynikowa:

12

67

42

...

18

06

67

94

Zdjęcie z kopca największego klucza Algorytmy i struktury danych

24

Sortowanie drzewiaste 67

67

55 55

44

42

55

Tablica wynikowa:

12

18

42

...

67

18

06

67

94

Utworzenie nowego kopca Algorytmy i struktury danych

25

Sortowanie drzewiaste

55 55

44

42

55

12

Tablica wynikowa:

18

42

...

67

18

06

94

Zdjęcie z kopca największego klucza Algorytmy i struktury danych

26

Sortowanie drzewiaste 55

18

55 55

44

42

55

Tablica wynikowa:

12

18

42

...

67

6

18

6

94

Utworzenie kolejnego kopca itd. Algorytmy i struktury danych

27

Sortowanie przez kopcowanie 





Metodę sortowania drzewiastego udoskonalił J.Williams (1964) Sortowanie przez kopcowanie (ang. heap sort) dowolnej tablicy A składa się z dwóch etapów: 1. Najpierw tablicę A przetwarzamy na tablicę reprezentującą kopiec 2. Następnie w pętli od 0 do n-1 wywołujemy funkcję usuwania z kopca (tablicy A) elementu największego; Po wykonaniu ostatniego punktu tablica A posortowana jest rosnąco

Algorytmy i struktury danych

28

Sortowanie przez kopcowanie Przekształcanie tablicy w kopiec (tzw. metodą wstępującą R.Floyda (1964)): for (i=indeks ostatniego węzła-nie liścia; i>=0; i--) 

odtwórz warunki kopca dla drzewa, którego korzeniem jest data[ i ] wywołując funkcję MoveDown(data, i, n-1);

Algorytmy i struktury danych

29

Sortowanie przez kopcowanie Działanie algorytmu sortowania przez kopcowanie dla tablicy [15 12 6 11 10 2 3 1 8] Krok 1

15

Zamiana korzenia z ostatnim elementem

6

12 11

1

10

2

3

8 15

Algorytmy i struktury danych

12

6

11

10

2

3

1

8

30

Sortowanie przez kopcowanie Krok 2 Zdjęcie z kopca elementu największego

8

6

12 11

1

10

2

3

15 8

Algorytmy i struktury danych

12

6

11

10

2

3

1

15

31

Sortowanie przez kopcowanie Krok 3 Przywrócenie drzewu własności kopca

12

6

11 8

1

10

2

3

15 12

Algorytmy i struktury danych

11

6

8

10

2

3

1

15

32

Sortowanie przez kopcowanie Krok 4 Zamiana korzenia z ostatnim elementem

1

6

11 8

12

10

2

3

15 1

Algorytmy i struktury danych

11

6

8

10

2

3

12

15

33

Sortowanie przez kopcowanie Krok 5 Przywrócenie drzewu własności kopca

11

6

10 8

12

1

2

3

15 11

Algorytmy i struktury danych

10

6

8

1

2

3

12

15

34

Sortowanie przez kopcowanie Krok 6 Zamiana korzenia z ostatnim elementem

3

6

10 8

12

1

2

11

15 3

Algorytmy i struktury danych

10

6

8

1

2

11

12

15

35

Sortowanie przez kopcowanie Krok 7 Przywrócenie drzewu własności kopca

10

6

8 3

12

1

2

11

15 10

Algorytmy i struktury danych

8

6

3

1

2

11

12

15

36

Sortowanie przez kopcowanie Krok 8 Zamiana korzenia z ostatnim elementem

2

6

8 3

12

1

10

11

15 2

Algorytmy i struktury danych

8

6

3

1

10

11

12

15

37

Sortowanie przez kopcowanie Krok 9 Przywrócenie drzewu własności kopca

8

6

3 2

12

1

10

11

15 8

Algorytmy i struktury danych

3

6

2

1

10

11

12

15

38

Sortowanie przez kopcowanie Krok 10 Zamiana korzenia z ostatnim elementem

1

6

3 2

12

8

10

11

15 1

Algorytmy i struktury danych

3

6

2

8

10

11

12

15

39

Sortowanie przez kopcowanie Krok 11 Przywrócenie drzewu własności kopca

6

1

3 2

12

8

10

11

15 6

Algorytmy i struktury danych

3

1

2

8

10

11

12

15

40

Sortowanie przez kopcowanie Krok 12 Zamiana korzenia z ostatnim elementem

2

1

3 6

12

8

10

11

15 2

Algorytmy i struktury danych

3

1

6

8

10

11

12

15

41

Sortowanie przez kopcowanie Krok 13 Przywrócenie drzewu własności kopca

3

1

2 6

12

8

10

11

15 3

Algorytmy i struktury danych

2

1

6

8

10

11

12

15

42

Sortowanie przez kopcowanie Krok 14 Zamiana korzenia z ostatnim elementem

1

3

2 6

12

8

10

11

15 1

Algorytmy i struktury danych

2

3

6

8

10

11

12

15

43

Sortowanie przez kopcowanie Krok 15 Przywrócenie drzewu własności kopca

2

3

1 6

12

8

10

11

15 2

Algorytmy i struktury danych

1

3

6

8

10

11

12

15

44

Sortowanie przez kopcowanie Krok 16 Zamiana korzenia z ostatnim elementem – sortowanie zakończone

1

3

2 6

12

8

10

11

15 1

Algorytmy i struktury danych

2

3

6

8

10

11

12

15

45

Sortowanie przez kopcowanie Idea algorytmu sortowania przez kopcowanie (ang. heap sort): heapsort(data[ ] ,n ) 1) przekształć tablicę w kopiec; 2) for (i=n-1; i>1; i--) { zamień korzeń z elementem na pozycji i; odtwórz własność kopca dla drzewa data[0], data[1], ..., data[i-1];

}

Algorytmy i struktury danych

46

Sortowanie przez kopcowanie Algorytm sortowania przez kopcowanie void heapsort( T data[ ], int n) { int i for (i=n/2-1; i>=0; i--) // utworzenie kopca MoveDown(data, i, n-1); for (i=n-1; i>=1; i--) { Swap(data[ 0 ],data[ i ]); // zdjęcie korzenia z kopca MoveDown(data, 0, i -1); // przywrócenie własności kopca } } Algorytmy i struktury danych

47

Sortowanie przez kopcowanie Analiza metody sortowania przez kopcowanie  

dla duŜych n metoda jest bardzo efektywna złoŜoność czasowa algorytmu (nawet w najgorszym przypadku): T(n)= O(n log2 n)

Algorytmy i struktury danych

48

Sortowanie metodą malejących przyrostów (Shella)

 Podstawą działania algorytmu sortowania Shella jest dzielenie tablicy na podtablice, zawierające elementy oddalone od siebie o h pozycji;  Idea algorytmu: określ liczby ht, ht-1, ..., h1 określające sposób podziału tablicy Tab na podtablice; for (h= ht; t > 1; t--, h= ht) podziel Tab na h podtablic; for (i=1; i≤ ≤h; i++) posortuj i-tą podtablicę; // dowolną metodą posortuj tablicę Tab; // dowolną metodą

Algorytmy i struktury danych

49

Sortowanie metodą malejących przyrostów (Shella)  sortowanie podtablic moŜe być realizowane dowolną metodą sortowania (najczęściej wykorzystuje się sortowanie przez wstawianie);  tablica wyjściowa dzielona jest na ht podtablic, tworzonych co ht-ty element; powstaje zatem ht podtablic, przy czym dla kaŜdej wartości h=1, 2, ..., ht zachodzi:

Tab h h [i] = Tab[i ⋅ h t + h − 1] t

 np. dla ht=3 tablica Tab = [ Tab [0], Tab [1], Tab [2], Tab [3],... ] zostanie podzielona na 3 podtablice: Tab1, Tab2 oraz Tab3 w następujący sposób: Tab31[0]=Tab[0], Tab31[1]=Tab[3], ..., Tab31[i]=Tab[3*i], ... Tab32[0]=Tab[1], Tab32[1]=Tab[4], ..., Tab32[i]=Tab[3*i+1], ... Tab33[0]=Tab[2], Tab33[1]=Tab[5], ..., Tab33[i]=Tab[3*i+2], ...

 wszystkie podtablice sortowane są niezaleŜnie;  następnie tworzone są nowe podtablice, przy czym ht-1< ht Algorytmy i struktury danych

50

Sortowanie metodą malejących przyrostów (Shella) Przykład   

Tab=[ 5, 3, 6, 7, 2, 1, 9, 4, 8 ] ht=3 Wówczas: Tab1=[ 5, 7, 9 ] Tab2=[ 3, 2, 4 ] Tab3=[ 6, 1, 8 ]

Algorytmy i struktury danych

51

Sortowanie metodą malejących przyrostów (Shella) Przykład sortowania metodą malejących przyrostów (Shella) z przyrostami: 5, 3, 1 h=5

h=3

h=1

1 2 3 4 5 1 2 3 4 5 1 2 3 1 2 3 1

Algorytmy i struktury danych

10 10

8

6

20

4

3 3

8

22

1

0

1 20

0 4

3

15 10

8

16 22

1

6 0

8

1

0 0

8

20 4 4

10

0

10

4 3 4

20

16

15

6 6

22 8

10 10 8

16

20

6 1 1 3

6

15 15 15

6

3

4 1

22 22

4 1

0 0

16 16

22 6

3 3

15

15 10

8 15

16 20 20 16

22 20

16 22 52

Sortowanie metodą malejących przyrostów (Shella)  Algorytm Shella ma dwie cechy, które mogą ulegać zmianie w róŜnych implementacjach:  sekwencja wartości przyrostów,  algorytm sortowania wykorzystywany do sortowania podtablic;  dobrym rozwiązaniem (wynikającym z praktyki) jest wykorzystanie sekwencji przyrostów spełniających warunki: h1 = 1 hi+1 = 3 hi + 1

oraz zakończeniem dzielenia tablicy na podtablice dla takiego ht, dla którego zachodzi ht+2 ≥ n;  np. jeśli n=10000 sekwencja przyrostów ma postać: 1, 4, 13, 40, 121, 364, 1093, 3280 tzn. t=8; h9= 3 h8 + 1=9841; h10= 3 h9 + 1=29524 Algorytmy i struktury danych

53

Sortowanie metodą malejących przyrostów (Shella)  o złoŜoności algorytmu decyduje ht i sposób zmiany h 

ht = 1 oznacza zwykłe sortowanie (np. przez wstawianie)



dla hi+1 = 3 hi + 1 (...., 40, 13, 4, 1 ) algorytm ma złoŜoność O(n1.25)



dla hi = 2i - 1 (..., 31, 15, 7, 3, 1 ) algorytm ma złoŜoność O(n1.2)

Algorytmy i struktury danych

54

Sortowanie metodą malejących przyrostów (Shella) Algorytm sortowania metodą malejących przyrostów (Shella) void ShellSort(T Tab[ ], int Size){ register int i, j hCnt, h; int increments[20], k; // stworzenie odpowiedniej liczby przyrostów h for (h=1, i=0; h<Size; i++){ increments[i]=h; h=3*h+1;} for (i--; i≥ ≥0; i--){ // pętla po wszystkich róŜnych przyrostach h h= increments[i]; for (hCnt=h; hCnt<2*h; hCnt++){ // pętla po liczbie podtablic „co h” w danym przebiegu for (j=hCnt; j<Size;){ // sortowanie przez wstawianie podtablicy T tmp=Tab[j]; k=j; while (k-h>=0 && tmp
Algorytmy i struktury danych

55

Sortowanie metodą malejących przyrostów (Shella)

 złoŜoność obliczeniowa algorytmu sortowania metodą malejących przyrostów (Shella) - O(n1,25)  zachodzi O(n2) ≥ O(n1,25) ≥ O(n log2 n)

Algorytmy i struktury danych

56

Sortowanie szybkie (quicksort)

Sortowanie szybkie (quicksort)  Metoda opracowana przez C.A.R. Hoarea  Podobnie jak metoda Shella zakłada dekompozycję tablicy na mniejsze podtablice (które jest łatwiej posortować)

Algorytmy i struktury danych

57

Sortowanie szybkie (quicksort)

Idea metody: Krok 1. Rozdzielić elementy danego ciągu e1, e2,... , en na dwie części względem pewnego ustalonego elementu, tzw. mediany (elementu osiowego), tak aby na lewo od niego znajdowały się elementy mniejsze, a na prawo elementy większe. Krok 2. Posortować elementy na lewo od mediany. Krok 3. Posortować elementy znajdujące się na prawo od mediany. Algorytmy i struktury danych

58

Sortowanie szybkie - przykład 10 5 7 8 14 12 3 4 1 Rozdzielanie ze względu na wybraną medianę Stosujemy rekurencyjnie tę samą zasadę do obu części

5 7 8 3 4 1 10 14 12 3 4 1 5 7 8

1 3 4

12 14

7 8

1 3 4 5 7 8 10 12 14 Algorytmy i struktury danych

59

Sortowanie szybkie (quicksort)

 Algorytm QuickSort jest typowym algorytmem rekurencyjnym;  W celu podzielenia tablicy konieczne jest wykonanie dwóch operacji:  znalezienie elementu osiowego (wyznaczającego podział tablicy na dwie podtablice),  przejrzeniu tablicy w celu umieszczenia jej elementów we właściwych podtablicach;  Wybór dobrego elementu osiowego nie jest zadaniem łatwym (obie podtablice powinny mieć zbliŜoną wielkość);  Najczęściej stosowane strategie wyboru elementu osiowego:  wybranie pierwszego elementu tablicy;  wybranie elementu znajdującego się pośrodku tablicy.

Algorytmy i struktury danych

60

Sortowanie szybkie (quicksort)

Algorytm QuickSort void QuickSort(int *Tab, int left, int right) { if (left < right) { int med=left; for ( int i=left+1; i < right; i++ ) if ( Tab[i] < Tab[left] ) Zamiana( Tab[++med], Tab[i] ); Zamiana( Tab[left], Tab[med] ); QuickSort(Tab, left, med-1); QuickSort(Tab, med+1, right); } } Algorytmy i struktury danych

61

Sortowanie szybkie (quicksort) Algorytm QuickSort - przykład 29

40

2

1

6

18

20

32

23

34

39

41

29 2

1

6

18

20

23

40

32

2 32 6

Algorytmy i struktury danych

2

39

41

40

1

1

34

6

18 18

20 20

34

39

41

23 23

29

32

34

39

40

41 62

Sortowanie szybkie – przypadek pesymistyczny  Przypadek pesymistyczny zachodzi wówczas, gdy wektor jest uporządkowany (np. rosnąco lub malejąco)  Pesymistyczna złoŜoność algorytmu QuickSort mierzona liczbą porównań wartości wynosi O(n 2)

Jeśli jako medianę wybiera się zawsze pierwszy element, to w wyniku rozdzielenia, jedna część „młodsza” będzie pusta , a druga „starsza” będzie zawierała o jeden element mniej niŜ w poprzednim kroku.

Koszt operacji rozdzielania dla n elementowego ciągu wynosi n-1 porównań.

n

T(n) = n − 1 + T(n − 1) = ∑ (i − 1) = O(n2 ) i=2

Algorytmy i struktury danych

63

Sortowanie szybkie – przypadek optymistyczny 

ZałoŜenie: n=2k, k=1,2,3,...



Przypadek optymistyczny ma miejsce wówczas, gdy tablice tablica jest dzielona na równe części



Średnia złoŜoność algorytmu QuickSort, wynosi wówczas T(n) = O(n lg n)



Liczba porównań w kolejnych iteracjach pętli wynosi:

T(n) = n + 2

n n n n + 2 ⋅ 2 + 2 ⋅ 2 ⋅ 2 + ... + n = 2 4 8 lg n n = n + ∑ n = n(1 + lg n) k =1

T(n) = O(n lg n) Algorytmy i struktury danych

64

Sortowanie szybkie – przypadek średni

Z badań wynika, Ŝe średnia złoŜoność algorytmu QuickSort jest bliŜsza przypadkowi optymistycznemu, tzn. wynosi T(n) = O(n lg n)

Algorytmy i struktury danych

65

Sortowanie przez scalanie (MergeSort)

Sortowanie przez scalanie (MergeSort)  Jeden z pierwszych algorytmów sortowania komputerowego;  Autor metody: John von Neumann  Podobnie jak metoda Shella zakłada dekompozycję tablicy na mniejsze podtablice (które jest łatwiej posortować)

Algorytmy i struktury danych

66

Sortowanie przez scalanie

Idea metody: (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.

Algorytmy i struktury danych

67

Sortowanie przez scalanie - przykład 16 5 12 4 10 6 1 13 15 7 1 14 9 3 8 11 16 5 12 4 10 6 1 13 16 5 12 4

10 6 1 13

16 5

12 4

10 6 1 13

5 16

4 12

6 10 1 13

4 5 12 16

15 7 1 14 9 3 8 11 15 7 1 14

9 3 8 11

1 6 10 13

1 4 5 6 10 12 13 16

1 3 7 8 9 11 14 15

1 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Algorytmy i struktury danych

68

Sortowanie przez scalanie (MergeSort)

Idea scalania dwóch podtablic w jedną scal(Tab, pierwszy, ostatni) { srd=(pierwszy+ostatni)/2; i1=0; i2=pierwszy; i3=srd+1; while (zarówno prawa, jak i lewa podtablica zawierają elementy) if (Tab[i2]
69

Sortowanie przez scalanie (MergeSort)

Idea algorytmu MergeSort MergeSort(Tab, pierwszy, ostatni) { if (pierwszy , ostatni) } srd=(pierwszy+ostatni)/2; MergeSort(Tab, pierwszy, srd); MergeSort(Tab, srd+1, ostatni); scal(Tab, pierwszy, ostatni); } }

Algorytmy i struktury danych

70

Sortowanie przez scalanie (MergeSort)

ZłoŜoność obliczeniowa algorytmu MergeSort a a

T(1) = 0

n T(n) = 2T( ) + n 2

 MoŜna pokazać, Ŝe: T(n)=O(n log2n) (takŜe w przypadku pesymistycznym)

Algorytmy i struktury danych

71

Efektywne algorytmy sortowania ZłoŜoność sortowania

Algorytmy i struktury danych

72

Efektywne algorytmy sortowania ZłoŜoność sortowania

Algorytmy i struktury danych

73

Demonstracja algorytmów sortowania 

http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html

pokaz

Algorytmy i struktury danych

74

Algorytmy i struktury danych

75

Related Documents

Aisd W9
November 2019 11
W9 Aavidthermalloyllc2008
December 2019 4
2019 W9
October 2019 15
Blamk W9
July 2020 4
Aisd Statement
June 2020 8
Aisd W02
November 2019 14