Sortowanie przez scalanie

Podobne dokumenty
Wykład 3. Metoda dziel i zwyciężaj

Strategia "dziel i zwyciężaj"

Algorytmy i Struktury Danych.

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Analiza algorytmów zadania podstawowe

Efektywna metoda sortowania sortowanie przez scalanie

Teoretyczne podstawy informatyki

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

TEORETYCZNE PODSTAWY INFORMATYKI

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Sortowanie przez wstawianie

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Analiza algorytmów zadania podstawowe

[12] Metody projektowania algorytmów (dziel i rządź, programowanie dynamiczne i algorytmy zachłanne).

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Algorytm selekcji Hoare a. Łukasz Miemus

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Wykład 2. Poprawność algorytmów

Problemy porządkowe zadania

Wstęp do programowania

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

Laboratoria nr 1. Sortowanie

Programowanie w VB Proste algorytmy sortowania

Programowanie dynamiczne cz. 2

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

Techniki konstruowania algorytmów. Metoda dziel i zwyciężaj

TEORETYCZNE PODSTAWY INFORMATYKI

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Informatyka A. Algorytmy

Algorytmy i Struktury Danych, 2. ćwiczenia

Struktury Danych i Złożoność Obliczeniowa

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

Wykład 4: Iteracja, indukcja i rekurencja

Algorytmy i Struktury Danych.

Sortowanie - wybrane algorytmy

Algorytmy i Struktury Danych. (c) Marcin Sydow. Introduction. QuickSort. Sortowanie 2. Limit. CountSort. RadixSort. Summary

Zaawansowane algorytmy. Wojciech Horzelski

Programowanie dynamiczne i algorytmy zachłanne

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Sortowanie przez wstawianie Insertion Sort

wstęp do informatyki i programowania część testowa (25 pyt. / 60 min.)

Sortowanie w czasie liniowym

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Zasady analizy algorytmów

Zaawansowane algorytmy i struktury danych

Laboratoria nr 1. Sortowanie

Wstęp do Programowania potok funkcyjny

Twój wynik: 4 punktów na 6 możliwych do uzyskania (66,67 %).

Matematyczne Podstawy Informatyki

Algorytmy i str ruktury danych. Metody algorytmiczne. Bartman Jacek

Technologie informacyjne Wykład VII-IX

Zaawansowane algorytmy i struktury danych

Porównanie czasów działania algorytmów sortowania przez wstawianie i scalanie

Podstawy Informatyki. Sprawność algorytmów

Sortowanie. LABORKA Piotr Ciskowski

1. Analiza algorytmów przypomnienie

Algorytmy sortujące 1

Wstęp do Programowania potok funkcyjny

Teoretyczne podstawy informatyki

Wstęp do programowania

Programowanie dynamiczne (optymalizacja dynamiczna).

Rekurencja. Przykład. Rozważmy ciąg

Wstęp do programowania

TEORETYCZNE PODSTAWY INFORMATYKI

Algorytmy i Struktury Danych.

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 13. Karol Tarnowski A-1 p.

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Algorytmy i Struktury Danych.

PODSTAWY INFORMATYKI wykład 5.

INFORMATYKA SORTOWANIE DANYCH.

Rekurencja/rekursja. Iluzja istnienia wielu kopii tego samego algorytmu (aktywacji) Tylko jedna aktywacja jest aktywna w danej chwili

Algorytmy i Struktury Danych.

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

WSTĘP DO INFORMATYKI WPROWADZENIE DO ALGORYTMIKI

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Sylabus modułu: Matematyczne podstawy informatyki (kod modułu:03-mo2n-12-mpln)

koordynator modułu dr hab. Michał Baczyński rok akademicki 2012/2013

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

Podyplomowe Studium Informatyki

5. Podstawowe algorytmy i ich cechy.

Algorytmy i struktury danych

EGZAMIN MATURALNY W ROKU SZKOLNYM 2017/2018 INFORMATYKA

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Algorytmy. Programowanie Proceduralne 1

Wprowadzenie do złożoności obliczeniowej

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Wykład 5: Iteracja, indukcja i rekurencja Sortowanie

Sortowanie bąbelkowe

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Jeszcze o algorytmach

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Wyszukiwanie. Wyszukiwanie binarne

Transkrypt:

Sortowanie przez scalanie Wykład 2 12 marca 2019 (Wykład 2) Sortowanie przez scalanie 12 marca 2019 1 / 17

Outline 1 Metoda dziel i zwyciężaj 2 Scalanie Niezmiennik pętli - poprawność algorytmu 3 Sortowanie przez scalanie Analiza złożoności czasowej 4 Sortowanie przez scalanie - podsumowanie (Wykład 2) Sortowanie przez scalanie 12 marca 2019 2 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: a) podtablica A[1... j-1] posortowana, (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: a) podtablica A[1... j-1] posortowana, b) wstawiamy element A[j], (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: a) podtablica A[1... j-1] posortowana, b) wstawiamy element A[j], c) podtablica A[1... j] posortowana. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: a) podtablica A[1... j-1] posortowana, b) wstawiamy element A[j], c) podtablica A[1... j] posortowana. Metoda dziel i zwyciężaj : (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: a) podtablica A[1... j-1] posortowana, b) wstawiamy element A[j], c) podtablica A[1... j] posortowana. Metoda dziel i zwyciężaj : Rekurencyjna struktura algorytmu - w celu rozwiązania danego problemu algorytm wywołuje sam siebie do rozwiązywania podobnych podproblemów. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: a) podtablica A[1... j-1] posortowana, b) wstawiamy element A[j], c) podtablica A[1... j] posortowana. Metoda dziel i zwyciężaj : Rekurencyjna struktura algorytmu - w celu rozwiązania danego problemu algorytm wywołuje sam siebie do rozwiązywania podobnych podproblemów. Sortowanie przez scalanie (von Neumann, 1945), sortowanie szybkie (Hoare, 1959), algorytm Karatsuba (1960), algorytm Strassena (1969),... (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

Projektowanie algorytmów Metoda przyrostowa - metoda naiwna: Sortowanie przez wstawianie: a) podtablica A[1... j-1] posortowana, b) wstawiamy element A[j], c) podtablica A[1... j] posortowana. Metoda dziel i zwyciężaj : Rekurencyjna struktura algorytmu - w celu rozwiązania danego problemu algorytm wywołuje sam siebie do rozwiązywania podobnych podproblemów. Sortowanie przez scalanie (von Neumann, 1945), sortowanie szybkie (Hoare, 1959), algorytm Karatsuba (1960), algorytm Strassena (1969),... decrease-and-conquer: wyszukiwanie binarne (Mauchly, 1946; Babilon, 200 p.n.e.), algorytm Euklidesa (300 p.n.e),... (Wykład 2) Sortowanie przez scalanie 12 marca 2019 3 / 17

divide et impera - dziel i zwyciężaj Dziel: dzielimy problem na podproblemy. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 4 / 17

divide et impera - dziel i zwyciężaj Dziel: dzielimy problem na podproblemy. Zwyciężaj: rozwiązujemy podproblemy rekurencyjnie lub używamy metod bezpośrednich, jeżeli nie wymagają wykorzystania rekursji. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 4 / 17

divide et impera - dziel i zwyciężaj Dziel: dzielimy problem na podproblemy. Zwyciężaj: rozwiązujemy podproblemy rekurencyjnie lub używamy metod bezpośrednich, jeżeli nie wymagają wykorzystania rekursji. Połącz: łączymy rozwiązania podproblemów, aby otrzymać rozwiązanie problemu początkowego. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 4 / 17

divide and conquer - dziel i zwyciężaj Sortowanie przez scalanie: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 5 / 17

divide and conquer - dziel i zwyciężaj Sortowanie przez scalanie: Dziel: Dzielimy n-elementowy ciąg na dwa podciągi po n 2 elementów każdy. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 5 / 17

divide and conquer - dziel i zwyciężaj Sortowanie przez scalanie: Dziel: Dzielimy n-elementowy ciąg na dwa podciągi po n 2 elementów każdy. Zwyciężaj: Sortujemy podciągi rekurencyjnie metodą sortowania przez scalanie. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 5 / 17

divide and conquer - dziel i zwyciężaj Sortowanie przez scalanie: Dziel: Dzielimy n-elementowy ciąg na dwa podciągi po n 2 elementów każdy. Zwyciężaj: Sortujemy podciągi rekurencyjnie metodą sortowania przez scalanie. Połącz: Łączymy posortowane podciągi w jeden posortowany ciąg. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 5 / 17

divide and conquer - dziel i zwyciężaj Sortowanie przez scalanie: Dziel: Dzielimy n-elementowy ciąg na dwa podciągi po n 2 elementów każdy. Zwyciężaj: Sortujemy podciągi rekurencyjnie metodą sortowania przez scalanie. Połącz: Łączymy posortowane podciągi w jeden posortowany ciąg. Scalanie - łączenie: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 5 / 17

divide and conquer - dziel i zwyciężaj Sortowanie przez scalanie: Dziel: Dzielimy n-elementowy ciąg na dwa podciągi po n 2 elementów każdy. Zwyciężaj: Sortujemy podciągi rekurencyjnie metodą sortowania przez scalanie. Połącz: Łączymy posortowane podciągi w jeden posortowany ciąg. Scalanie - łączenie: Nie ma rekursji gdy sortujemy ciąg jednoelementowy. Automatycznie posortowany. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 5 / 17

divide and conquer - dziel i zwyciężaj Sortowanie przez scalanie: Dziel: Dzielimy n-elementowy ciąg na dwa podciągi po n 2 elementów każdy. Zwyciężaj: Sortujemy podciągi rekurencyjnie metodą sortowania przez scalanie. Połącz: Łączymy posortowane podciągi w jeden posortowany ciąg. Scalanie - łączenie: Nie ma rekursji gdy sortujemy ciąg jednoelementowy. Automatycznie posortowany. Podstawową operacją algorytmu sortowania przez scalanie jest łączenie dwóch posortowanych ciągów w kroku połącz. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 5 / 17

Scalanie - MERGE(A, p, q, r) A - tablica, p, q, r - indeksy, takie że p q < r. Założenie: Podtablice A[p...q], A[q+1...r] są posortowane. Procedura MERGE (A, p, q, r) scala podtablice A[p...q] oraz A[q+1...r] w posortowaną tablicę A[p...r]. Czas działania: Θ(n), gdzie n = r p + 1. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 6 / 17

Scalanie - MERGE(A, p, q, r) MERGE(A, p, q, r) 1: a q p + 1 2: b r q 3: //utworz tablice L[1..a + 1] oraz R[1..b + 1] 4: for i 1 to a do 5: L[i] A[p + i 1] 6: for j 1 to b do 7: R[j] A[q + j] 8: L[a + 1] 9: R[b + 1] 10: i 1 11: j 1 12:... (Wykład 2) Sortowanie przez scalanie 12 marca 2019 7 / 17

Scalanie - MERGE(A, p, q, r) cd. MERGE(A, p, q, r) cd. 12: for k p to r do 13: if L[i] R[j] then 14: A[k] L[i] 15: i i + 1 16: else 17: A[k] R[j] 18: j j + 1 (Wykład 2) Sortowanie przez scalanie 12 marca 2019 8 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. Kopiujemy podtablicę A[p..q] do L[1..a]. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. Kopiujemy podtablicę A[p..q] do L[1..a]. Kopiujemy podtablicę A[q+1..r] do R[1..b]. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. Kopiujemy podtablicę A[p..q] do L[1..a]. Kopiujemy podtablicę A[q+1..r] do R[1..b]. Na końcach podtablic L i R umieszczamy wartowników. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. Kopiujemy podtablicę A[p..q] do L[1..a]. Kopiujemy podtablicę A[q+1..r] do R[1..b]. Na końcach podtablic L i R umieszczamy wartowników. Scalanie: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. Kopiujemy podtablicę A[p..q] do L[1..a]. Kopiujemy podtablicę A[q+1..r] do R[1..b]. Na końcach podtablic L i R umieszczamy wartowników. Scalanie: Wykonujemy r - p + 1 operacji, które zachowują następujący niezmiennik pętli: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. Kopiujemy podtablicę A[p..q] do L[1..a]. Kopiujemy podtablicę A[q+1..r] do R[1..b]. Na końcach podtablic L i R umieszczamy wartowników. Scalanie: Wykonujemy r - p + 1 operacji, które zachowują następujący niezmiennik pętli: i) Na początku każdej iteracji pętli for podtablica A[p..k-1] zawiera k - p najmniejszych elementów tablic L[1..a+1] oraz R[1..b+1], w kolejności posortowanej. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - MERGE(A, p, q, r) Inicjalizacja: Tworzymy podtablice L, R. Kopiujemy podtablicę A[p..q] do L[1..a]. Kopiujemy podtablicę A[q+1..r] do R[1..b]. Na końcach podtablic L i R umieszczamy wartowników. Scalanie: Wykonujemy r - p + 1 operacji, które zachowują następujący niezmiennik pętli: i) Na początku każdej iteracji pętli for podtablica A[p..k-1] zawiera k - p najmniejszych elementów tablic L[1..a+1] oraz R[1..b+1], w kolejności posortowanej. ii) L[i] oraz R[j] są najmniejszymi elementami swoich tablic, które nie zostały jeszcze skopiowane z powrotem do A. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 9 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Inicjowanie: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 10 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Inicjowanie: Przed pierwszą iteracją pętli k = p, podtablica A[p..k-1] jest pusta. Zawiera k p = 0 najmniejszych elementów tablic L i R. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 10 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Inicjowanie: Przed pierwszą iteracją pętli k = p, podtablica A[p..k-1] jest pusta. Zawiera k p = 0 najmniejszych elementów tablic L i R. i = j = 1, czyli L[i] oraz R[j] są najmniejszymi elementami tablic, które nie zostały jeszcze skopiowane z powrotem do A. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 10 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Inicjowanie: Przed pierwszą iteracją pętli k = p, podtablica A[p..k-1] jest pusta. Zawiera k p = 0 najmniejszych elementów tablic L i R. i = j = 1, czyli L[i] oraz R[j] są najmniejszymi elementami tablic, które nie zostały jeszcze skopiowane z powrotem do A. Utrzymanie: Każda iteracja zachowuje niezmiennik pętli. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 10 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Inicjowanie: Przed pierwszą iteracją pętli k = p, podtablica A[p..k-1] jest pusta. Zawiera k p = 0 najmniejszych elementów tablic L i R. i = j = 1, czyli L[i] oraz R[j] są najmniejszymi elementami tablic, które nie zostały jeszcze skopiowane z powrotem do A. Utrzymanie: Każda iteracja zachowuje niezmiennik pętli. Jeżeli L[i] R[j] to L[i] jest najmniejszym elementem nie skopiowanym jeszcze z powrotem do A. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 10 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Inicjowanie: Przed pierwszą iteracją pętli k = p, podtablica A[p..k-1] jest pusta. Zawiera k p = 0 najmniejszych elementów tablic L i R. i = j = 1, czyli L[i] oraz R[j] są najmniejszymi elementami tablic, które nie zostały jeszcze skopiowane z powrotem do A. Utrzymanie: Każda iteracja zachowuje niezmiennik pętli. Jeżeli L[i] R[j] to L[i] jest najmniejszym elementem nie skopiowanym jeszcze z powrotem do A. Podtablica A[p..k-1] zawiera k p najmniejszych elementów, zatem po skopiowaniu w wierszu 14 elementu L[i] do A[k] podtablica A[p..k] będzie zawierać k p + 1 najmniejszych elementów. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 10 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Inicjowanie: Przed pierwszą iteracją pętli k = p, podtablica A[p..k-1] jest pusta. Zawiera k p = 0 najmniejszych elementów tablic L i R. i = j = 1, czyli L[i] oraz R[j] są najmniejszymi elementami tablic, które nie zostały jeszcze skopiowane z powrotem do A. Utrzymanie: Każda iteracja zachowuje niezmiennik pętli. Jeżeli L[i] R[j] to L[i] jest najmniejszym elementem nie skopiowanym jeszcze z powrotem do A. Podtablica A[p..k-1] zawiera k p najmniejszych elementów, zatem po skopiowaniu w wierszu 14 elementu L[i] do A[k] podtablica A[p..k] będzie zawierać k p + 1 najmniejszych elementów. Zwiększenie k oraz i powoduje odtworzenie niezmiennika pętli przed następną iteracją. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 10 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Zakończenie: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 11 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Zakończenie: Gdy pętla się kończy, to k = r + 1. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 11 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Zakończenie: Gdy pętla się kończy, to k = r + 1. Na mocy niezmiennika pętli podtablica A[p..k-1], czyli A[p..r], zawiera k p = r p + 1 najmniejszych elementów tablic L[1..a+1] oraz R[1..b+1], w kolejności posortowanej. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 11 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Zakończenie: Gdy pętla się kończy, to k = r + 1. Na mocy niezmiennika pętli podtablica A[p..k-1], czyli A[p..r], zawiera k p = r p + 1 najmniejszych elementów tablic L[1..a+1] oraz R[1..b+1], w kolejności posortowanej. Tablice L i R zawierają łącznie a + b + 2 = r p + 3 elementy. Wszystkie elementy, poza wartownikami zostały skopiowane z powrotem do A. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 11 / 17

Scalanie - niezmiennik pętli - poprawność algorytmu Zakończenie: Gdy pętla się kończy, to k = r + 1. Na mocy niezmiennika pętli podtablica A[p..k-1], czyli A[p..r], zawiera k p = r p + 1 najmniejszych elementów tablic L[1..a+1] oraz R[1..b+1], w kolejności posortowanej. Tablice L i R zawierają łącznie a + b + 2 = r p + 3 elementy. Wszystkie elementy, poza wartownikami zostały skopiowane z powrotem do A. Algorytm jest poprawny. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 11 / 17

Sortowanie przez scalanie - MERGE-SORT(A, p, r) Procedura sortuje elementy w podtablicy A[p...r]. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 12 / 17

Sortowanie przez scalanie - MERGE-SORT(A, p, r) Procedura sortuje elementy w podtablicy A[p...r]. Jeżeli p r to podtablica jest posortowana - warunek zakończenia. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 12 / 17

Sortowanie przez scalanie - MERGE-SORT(A, p, r) Procedura sortuje elementy w podtablicy A[p...r]. Jeżeli p r to podtablica jest posortowana - warunek zakończenia. W przeciwnym razie znajdujemy q, które dzieli A[p... r] na dwie podtablice: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 12 / 17

Sortowanie przez scalanie - MERGE-SORT(A, p, r) Procedura sortuje elementy w podtablicy A[p...r]. Jeżeli p r to podtablica jest posortowana - warunek zakończenia. W przeciwnym razie znajdujemy q, które dzieli A[p... r] na dwie podtablice: a) A[p...q] zawierającą floor(n/2) elementów, (Wykład 2) Sortowanie przez scalanie 12 marca 2019 12 / 17

Sortowanie przez scalanie - MERGE-SORT(A, p, r) Procedura sortuje elementy w podtablicy A[p...r]. Jeżeli p r to podtablica jest posortowana - warunek zakończenia. W przeciwnym razie znajdujemy q, które dzieli A[p... r] na dwie podtablice: a) A[p...q] zawierającą floor(n/2) elementów, b) A[q+1...r] zawierającą ceil(n/2) elementów. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 12 / 17

Sortowanie przez scalanie - MERGE-SORT(A, p, r) MERGE-SORT(A, p, r) 1: if p < r then( ) p + r 2: q floor 2 3: MERGE-SORT(A, p, q) 4: MERGE-SORT(A, q+1, r) 5: MERGE(A, p, q, r) (Wykład 2) Sortowanie przez scalanie 12 marca 2019 13 / 17

Sortowanie przez scalanie - MERGE-SORT(A, p, r) MERGE-SORT(A, p, r) 1: if p < r then( ) p + r 2: q floor 2 3: MERGE-SORT(A, p, q) 4: MERGE-SORT(A, q+1, r) 5: MERGE(A, p, q, r) Przykład (Wykład 2) Sortowanie przez scalanie 12 marca 2019 13 / 17

Sortowanie przez scalanie - drzewo wywołań rekurencyjnych MS(1,6) MS(1,3) MS(4,6) M(1,3,6) MS(1,2) MS(3,3) M(1,2,3) MS(4,5) MS(6,6) M(4,5,6) MS(1,1) MS(2,2) M(1,1,2) MS(4,4) MS(5,5) M(4,4,5) (Wykład 2) Sortowanie przez scalanie 12 marca 2019 14 / 17

Sortowanie przez scalanie - złożoność czasowa Sortowanie przez scalanie: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 15 / 17

Sortowanie przez scalanie - złożoność czasowa Sortowanie przez scalanie: i) Dziel: Znajdujemy środek przedziału D(n) = Θ(1). (Wykład 2) Sortowanie przez scalanie 12 marca 2019 15 / 17

Sortowanie przez scalanie - złożoność czasowa Sortowanie przez scalanie: i) Dziel: Znajdujemy środek przedziału D(n) = Θ(1). ii) Zwyciężaj: Rozwiązujemy rekurencyjne dwa problemy, każdy o rozmiarze n 2, (Wykład 2) Sortowanie przez scalanie 12 marca 2019 15 / 17

Sortowanie przez scalanie - złożoność czasowa Sortowanie przez scalanie: i) Dziel: Znajdujemy środek przedziału D(n) = Θ(1). ii) Zwyciężaj: Rozwiązujemy rekurencyjne dwa problemy, każdy o rozmiarze n 2, czas działania: T (n) = 2T ( n 2 ), iii) Połącz: Procedura MERGE działa w czasie P(n) = Θ(n). (Wykład 2) Sortowanie przez scalanie 12 marca 2019 15 / 17

Sortowanie przez scalanie - złożoność czasowa Sortowanie przez scalanie: i) Dziel: Znajdujemy środek przedziału D(n) = Θ(1). ii) Zwyciężaj: Rozwiązujemy rekurencyjne dwa problemy, każdy o rozmiarze n 2, czas działania: T (n) = 2T ( n 2 ), iii) Połącz: Procedura MERGE działa w czasie P(n) = Θ(n). Złożoność obliczeniowa sortowanie przez scalanie - równanie rekurencyjne: { Θ(1), jeżeli n = 1, T (n) = ( n ) 2T + Θ(n), jeżeli n > 1. 2 (Wykład 2) Sortowanie przez scalanie 12 marca 2019 15 / 17

Sortowanie przez scalanie - złożoność czasowa Sortowanie przez scalanie: i) Dziel: Znajdujemy środek przedziału D(n) = Θ(1). ii) Zwyciężaj: Rozwiązujemy rekurencyjne dwa problemy, każdy o rozmiarze n 2, czas działania: T (n) = 2T ( n 2 ), iii) Połącz: Procedura MERGE działa w czasie P(n) = Θ(n). Złożoność obliczeniowa sortowanie przez scalanie - równanie rekurencyjne: { Θ(1), jeżeli n = 1, T (n) = ( n ) 2T + Θ(n), jeżeli n > 1. 2 Złożoność obliczeniowa sortowanie przez scalanie - korzystając z twierdzenia o rekurencji uniwersalnej: T (n) = Θ(n log 2 (n)). (Wykład 2) Sortowanie przez scalanie 12 marca 2019 15 / 17

Sortowanie przez scalanie Dell Precision 5820: Intel(R) Xeon(R) W-2155 CPU 3.30GHz T MS (n) - czas sortowania [sekundy] 1.4 1.2 1 0.8 0.6 0.4 0.2 MERGE-SORT T MS (n)=58.07*10-10 *n*log 2 (n) [sekundy] INSERTION-SORT T IS (n)=8.65*10-14 *n 2 [godziny] T IS (n)=2.97*10-10 *n 2 [sekundy] 8 7 6 5 4 3 2 1 T IS (n) - czas sortowania [godziny] 0 0 1x10 6 2x10 6 3x10 6 4x10 6 5x10 6 6x10 6 7x10 6 8x10 6 9x10 6 1x10 70 n - rozmiar tablicy (Wykład 2) Sortowanie przez scalanie 12 marca 2019 16 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), T sr (n) = Θ(n log(n)), (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), T sr (n) = Θ(n log(n)), T p (n) = O(n log(n)). (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), T sr (n) = Θ(n log(n)), T p (n) = O(n log(n)). Złożoność pamięciowa: nie działa w miejscu, wymaga O(n) dodatkowej pamięci, (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), T sr (n) = Θ(n log(n)), T p (n) = O(n log(n)). Złożoność pamięciowa: nie działa w miejscu, wymaga O(n) dodatkowej pamięci, Typowa implementacja: rekurencyjna. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), T sr (n) = Θ(n log(n)), T p (n) = O(n log(n)). Złożoność pamięciowa: nie działa w miejscu, wymaga O(n) dodatkowej pamięci, Typowa implementacja: rekurencyjna. Stabilność sortowania: stabilne - nie zmiennia względnego porządku pomiędzy jednakowymi elementami tablicy. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), T sr (n) = Θ(n log(n)), T p (n) = O(n log(n)). Złożoność pamięciowa: nie działa w miejscu, wymaga O(n) dodatkowej pamięci, Typowa implementacja: rekurencyjna. Stabilność sortowania: stabilne - nie zmiennia względnego porządku pomiędzy jednakowymi elementami tablicy. Łatwy do zrównoleglenia. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17

Sortowanie przez scalanie - podsumowanie Złożoność obliczeniowa: T o (n) = Ω(n log(n)), T sr (n) = Θ(n log(n)), T p (n) = O(n log(n)). Złożoność pamięciowa: nie działa w miejscu, wymaga O(n) dodatkowej pamięci, Typowa implementacja: rekurencyjna. Stabilność sortowania: stabilne - nie zmiennia względnego porządku pomiędzy jednakowymi elementami tablicy. Łatwy do zrównoleglenia. Timsort - stabilny algorytm sortowania będący hybrydą sortowania przez scalanie i przez wstawianie - standardowy algorytm sortowania dla języka Python, platformy Android, Google Chrome. (Wykład 2) Sortowanie przez scalanie 12 marca 2019 17 / 17