1 / 19

Sortowanie przez scalanie

Sortowanie przez scalanie. ( mergesort ). Sortowanie przez scalanie wstęp. W informatyce sortowanie przez scalanie (ang. m erge sort ) , to rekurencyjny algorytm sortowania danych.

Download Presentation

Sortowanie przez scalanie

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. Sortowanie przez scalanie (mergesort)

  2. Sortowanie przez scalanie wstęp 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.

  3. Sortowanie przez scalanie zasada działania Algorytm mergesort dzieli się na trzy części: • dzielenie tablicy na dwa wycinki, • wywołanie rekurencyjne algorytmu sortującego na tych wycinkach, • 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.

  4. Sortowanie przez scalanie opis słowny algorytmu (procedura mergesort) 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

  5. Sortowanie przez scalanie zasada działania 4 6 3 2 1 5 8 7 Początek algorytmu 4 6 3 2 1 5 8 7 Po pierwszym wywołaniu 4 6 3 2 1 5 8 7 Po drugim wywołaniu 4 6 3 2 1 5 8 7 Po trzecim wywołaniu

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

  7. Sortowanie przez scalanie scalanie posortowanych tablic (procedura merge) W procedurze scalania dwóch posortowanych wycinków wykorzystamy dwa indeksy:poz1oraz 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;

  8. Sortowanie przez scalanie opis słowny algorytmu scalania (merge) 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.

  9. Sortowanie przez scalanie opis słowny algorytmu scalania (merge) 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

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

  11. Sortowanie przez scalanie scalanie elementów poz1 poz2 1 2 3 4 5 6 7 8 Początek:=1 Środek:=4 Koniec:=8 2 3 4 6 1 5 7 8 tablica pomocnicza

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

  13. 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) for i:=poczatek to koniec do begin ifpoz1 > srodekthen begin tabx[pozx]:=tab[poz2]; poz2:=poz2+1; pozx:=pozx+1; end else

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

  15. Sortowanie przez scalanie tekst procedury merge (porównaj wartości elementów tablicy i przepisz mniejszy do tablicy tymczasowej, zwiększ indeks o jeden) elseiftab[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; end;

  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(2n). Podczas wykonywania rekurencji otrzymujemy drzewo o głębokości log2n, 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 log2n

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

  19. Sortowanie przez scalanie Literatura • A. Strusińska-Walczak, K. Walczak„Programowanie w języku Turbo Pascal 7.0”, Wydawnictwo W&W, 1998 • http://www.wikipedia.pl

More Related