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