Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Sortowanie przez scalanie (mergesort). W informatyce sortowanie przez scalanie (ang. merge sort), to rekurencyjny algorytm sortowania danych. Algorytm.

Podobne prezentacje


Prezentacja na temat: "Sortowanie przez scalanie (mergesort). W informatyce sortowanie przez scalanie (ang. merge sort), to rekurencyjny algorytm sortowania danych. Algorytm."— Zapis prezentacji:

1 Sortowanie przez scalanie (mergesort)

2 W informatyce sortowanie przez scalanie (ang. merge sort), to rekurencyjny algorytm sortowania danych. Algorytm ten jest dobrym przykładem algorytmów typu Dziel i zwyciężaj. Ideą działania tego typu algorytmów jest podział problemu na mniejsze części, których rozwiązanie jest już łatwiejsze. Sortowanie przez scalanie wstęp

3 Algorytm mergesort dzieli się na trzy części: 1.dzielenie tablicy na dwa wycinki, 2.wywołanie rekurencyjne algorytmu sortującego na tych wycinkach, 3.scalenie dwóch posortowanych wycinków. Dzielenie tablicy odbywa się dopóki wycinek zawiera więcej niż jeden element. W rezultacie otrzymamy n-wycinków jednoelementowych (gdzie n oznacza ilość elementów w tablicy) Zwróćmy uwagę, iż zbiór jednoelementowy jest z założenia posortowany. Sortowanie przez scalanie zasada działania

4 Podziel tablicę na dwa wycinki Jeżeli lewy wycinek zawiera więcej niż jeden element to wywołaj rekurencyjnie procedurę mergesort Jeżeli prawy wycinek zawiera więcej niż jeden element, to wywołaj rekurencyjnie procedurę mergesort Scal dwa posortowane wycinki Sortowanie przez scalanie opis słowny algorytmu (procedura mergesort)

5 Początek algorytmu Po pierwszym wywołaniu Po drugim wywołaniu Po trzecim wywołaniu Sortowanie przez scalanie zasada działania

6 procedure mergesort(poczatek,koniec: integer; var tab:tablica); var srodek: integer; {deklaracja zmiennej} begin srodek:=(poczatek + koniec) div 2; {wyznaczanie środkowego indeksu} if poczatek < srodek then mergesort(poczatek, srodek); {jeśli lewy wycinek zawiera więcej niż 2 elementy, sortuj lewy wycinek} if srodek+1 < koniec then mergesort(srodek+1, koniec); {jeśli prawy wycinek zawiera więcej niż 2 elementy, sortuj prawy wycinek} merge(poczatek, srodek, koniec; var tab:tablica); {scal dwa posortowane wycinki} end; Sortowanie przez scalanie tekst procedury mergesort

7 W procedurze scalania dwóch posortowanych wycinków wykorzystamy dwa indeksy: poz1 oraz poz2. Indeks poz1 przebiega pierwszy wycinek, a indeks poz2 przebiega drugi wycinek. Wartości tych indeksów powinny być następujące: poz1:= początek; poz2:=środek+1; Sortowanie przez scalanie scalanie posortowanych tablic (procedura merge)

8 Dla każdego elementu dwóch wycinków wykonuj: jeżeli tab[poz1] < tab[poz2] to dodaj do tablicy pomocniczej element tab[poz1] oraz zwiększ indeks poz1 w przeciwnym wypadku dodaj do tablicy pomocniczej element tab[poz2] oraz zwiększ indeks poz2 Rozwiązanie nie uwzględnia sytuacji, gdy któryś z elementów jest pusty. Sortowanie przez scalanie opis słowny algorytmu scalania (merge)

9 Dla każdego elementu dwóch wycinków wykonuj: jeżeli pierwszy wycinek jest pusty to dodaj do tablicy pomocniczej element tab[poz2] zwiększ poz2 w przeciwnym wypadku jeżeli drugi wycinek jest pusty to dodaj do tablicy pomocniczej element tab[poz1] zwiększ poz1 w przeciwnym wypadku jeżeli tab[poz1] < tab[poz2] to dodaj do tablicy pomocniczej element tab[poz1] zwiększ indeks poz1 w przeciwnym wypadku dodaj do tablicy pomocniczej element tab[poz2] zwiększ indeks poz2 koniec Sortowanie przez scalanie opis słowny algorytmu scalania (merge)

10 Zdanie wycinek pierwszy jest pusty realizujemy przy pomocy warunku poz1>środek natomiast zdanie wycinek drugi jest pusty realizujemy przy pomocy warunku poz2>koniec Sortowanie przez scalanie opis słowny algorytmu scalania (merge)

11 Sortowanie przez scalanie scalanie elementów poz1poz2 Początek:=1 Środek:=4 Koniec:=8 tablica pomocnicza

12 procedure merge(poczatek, srodek, koniec: integer; var tab:tablica); var poz1, poz2, pozx, i : integer; tabx: tablica; begin poz1:=poczatek; poz2:=srodek+1; pozx:=poczatek; Sortowanie przez scalanie tekst procedury merge (deklaracje zmiennych i przypisanie zmiennym początkowych wartości)

13 for i:=poczatek to koniec do begin if poz1 > srodek then begin tabx[pozx]:=tab[poz2]; poz2:=poz2+1; pozx:=pozx+1; end else Sortowanie przez scalanie tekst procedury merge (dla każdego elementu z dwóch wycinków wykonuj: jeśli pierwszy wycinek jest pusty przepisz element z wycinka drugiego i zwiększ indeks poz2 o jeden)

14 if poz2 > koniec then begin tabx[pozx]:=tab[poz1]; poz1:=poz1+1; pozx:=pozx+1; end Sortowanie przez scalanie tekst procedury merge (jeśli drugi wycinek jest pusty przepisz element z wycinka pierwszego i zwiększ indeks poz1 o jeden)

15 else if tab[poz1] < tab[poz2] then begin tabx[pozx]:=tab[poz1]; poz1:=poz1+1; pozx:=pozx+1; end else begin tabx[pozx]:=tab[poz2]; poz2:=poz2+1; pozx:=pozx+1; end; Sortowanie przez scalanie tekst procedury merge (porównaj wartości elementów tablicy i przepisz mniejszy do tablicy tymczasowej, zwiększ indeks o jeden)

16 Sortowanie przez scalanie tekst procedury merge (przepisywanie elementów z tablicy pomocniczej do wejściowej) for i:=poczatek to koniec do tab[i]:=tabx[i]; end;

17 Sortowanie przez scalanie złożoność czasowa algorytmu (nieformalna) Bez straty ogólności załóżmy, że długość ciągu, który mamy posortować jest potęgą 2 (2 n ). Podczas wykonywania rekurencji otrzymujemy drzewo o głębokości log 2 n, na każdym poziomie dokonujemy scalenia o łącznym koszcie n c, gdzie c jest stałą zależną od komputera. A więc nieformalnie możemy dowieść, że złożoność algorytmu mergesort to n log 2 n

18 Sortowanie przez scalanie przykładowe wyniki działania programu

19 A. Strusińska-Walczak, K. Walczak Programowanie w języku Turbo Pascal 7.0, Wydawnictwo W&W, Sortowanie przez scalanie Literatura


Pobierz ppt "Sortowanie przez scalanie (mergesort). W informatyce sortowanie przez scalanie (ang. merge sort), to rekurencyjny algorytm sortowania danych. Algorytm."

Podobne prezentacje


Reklamy Google