Algorytmy i Struktury Danych. Problem Sortowania. Metoda Dziel i zwyciężaj. dr hab. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 1 / 69
Problem Sortowania Definicja problemu Niech (U, ) będzie zbiorem liniowo uporzadkowanym z relacja porzadkuj ac a i niech (a 1, a 2,..., a n ) będzie ciagiem n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutację (a 1, a 2,..., a n) taka, że (a 1 a 2 a n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 2 / 69
Problem Sortowania Definicja problemu Niech (U, ) będzie zbiorem liniowo uporzadkowanym z relacja porzadkuj ac a i niech (a 1, a 2,..., a n ) będzie ciagiem n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutację (a 1, a 2,..., a n) taka, że (a 1 a 2 a n). Uwaga! Na U moga składać się zarówno liczby całkowite lub rzeczywiste, jak i U może być zbiorem rekordów, które należy posortować według ich kluczy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 2 / 69
Problem Sortowania - przykład, dane całkowite Dane wejściowe: 12345 34567 6789 45678 456 34 56 111111 234 Dane uporzadkowane: 34 56 234 456 6789 12345 34567 45678 111111 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 3 / 69
Problem Sortowania - przykład, rekordy danych Dane poczatkowe: Imię Nazwisko Pesel Jan Kowalski 00120188221 Jan Brzechwa 71111177662 Adrian Bala 73102277883 Piotr Kula 67112966554 Paweł Nowak 82032234345 Klucz Rekord Zadanie: Posortuj (uporzadkuj) tablicę N elementów (rekordów składajacych się z imienia, nazwiska i pesela) w kolejności rosnacej według klucza Nazwisko. Imię Nazwisko Pesel Adrian Bala 73102277883 Jan Brzechwa 71111177662 Jan Kowalski 00120188221 Piotr Kula 67112966554 Paweł Nowak 82032234345 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 4 / 69
Komenda sort w Linux Dane wejściowe: Jan Kowalski 4321 Jan Nowak 1234 Piotr Biały 3214 Beata Nowicka 4132 Anna Szymoniak 2314 Dane wyjściowe: $ sort dane.txt Anna Szymoniak 2314 Beata Nowicka 4132 Jan Kowalski 4321 Jan Nowak 1234 Piotr Biały 3214 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 5 / 69
Komenda sort w Linux Dane wejściowe: Jan Kowalski 4321 Jan Nowak 1234 Piotr Biały 3214 Beata Nowicka 4132 Anna Szymoniak 2314 Dane wyjściowe: $ sort -k2 dane.txt Piotr Biały 3214 Jan Kowalski 4321 Jan Nowak 1234 Beata Nowicka 4132 Anna Szymoniak 2314 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 6 / 69
Komenda sort w Linux Dane wejściowe: Unix Linux Solaris Linux Windows Mac Unix Dane wyjściowe: $ sort -u dane.txt Linux Mac Solaris Unix Windows Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 7 / 69
Komenda sort w Linux Dane wejściowe: 34567 6789 45678 456 34 111111 234 Dane wyjściowe: $ sort danenumeric.txt -n 34 234 456 6789 34567 45678 111111 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 8 / 69
Komenda sort w Linux Dane wejściowe: 34567 6789 45678 456 34 111111 234 Dane wyjściowe:$ sort -nr dane.txt 111111 45678 34567 6789 456 234 34 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 9 / 69
Komenda sort w Linux Dane wejściowe: $ cat file1 20 19 5 49 200 $ cat file2 25 18 5 48 200 Dane wyjściowe: sort może sortować wiele plików $ sort -n file1 file2 5 5 18 19 20 25 48 49 200 200 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 10 / 69
Popularne algorytmy sortowania Sortowanie przez porównywanie elementów: Sortowanie przez selekcję (ang. selection sort) Sortowanie przez wstawianie (ang. insertion sort) Sortowanie babelkowe (ang. bubble sort) Sortowanie koktajlowe (ang. cocktail sort) Sortowanie pozycyjne (ang. radix sort) Sortowanie metoda dziel i zwyciężaj Inne Sortowanie przez scalanie (ang. merge sort) Sortowanie szybkie (ang. quick sort) Sortowanie przez zliczanie (ang. counting sort) Sortowanie przez kopcowanie (ang. heap sort) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 11 / 69
Sortowanie stabilne Definicja Dana metoda sortowania jest stabilna, jeśli zachowuje względna kolejność elementów ze zdublowanymi kluczami. Dane Wejściowe Sortowanie stabilne Adam 1 Adam 1 Beta 2 Wojciech 1 Cezary 3 Ireneusz 1 Wojciech 1 Beta 2 Grzegorz 2 Grzegorz 2 Piotr 3 Jerzy 2 Jerzy 2 Barbara 2 Ireneusz 1 Cezary 3 Barbara 2 Piotr 3 Waldemar 3 Waldemar 3 Kazimierz 3 Kazimierz 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 12 / 69
Sortowanie stabilne cd. Przykład na niestabilność: $sort -k2 dane.txt Dane Wejściowe Sortowanie niestabilne Adam 1 Adam 1 Beta 2 Ireneusz 1 Cezary 3 Wojciech 1 Wojciech 1 Barbara 2 Grzegorz 2 Beta 2 Piotr 3 Grzegorz 2 Jerzy 2 Jerzy 2 Ireneusz 1 Cezary 3 Barbara 2 Kazimierz 3 Waldemar 3 Piotr 3 Kazimierz 3 Waldemar 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 13 / 69
Podział algorytmów sortowania wg. stabilonści Algorytmy sortowania stabilnego: Sortowanie przez wstawianie (ang. insertion sort) Sortowanie babelkowe (ang. bubblesort) Sortowanie koktajlowe (ang. cocktail sort) Sortowanie pozycyjne (ang. radix sort) Sortowanie przez scalanie (ang. merge sort) Sortowanie przez zliczanie (ang. counting sort) części wykładu Algorytmy sortowania niestabilnego: Sortowanie przez selekcję (ang. selection sort)) Sortowanie szybkie (ang. quicksort) Sortowanie przez kopcowanie (ang. heapsort) - omówione na wykładach późniejszych Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 14 / 69
Sortowanie danych całkowitych - Java I import java.util.random; import java.util.arrays; import java.util.scanner; public class IntSorter { public static void generate(int[] tab, int max) { Random r = new Random(); for (int j = 0; j < tab.length; ++j) { tab[j] = r.nextint(max)-max/2; } } public static void printtab(int[] tab) { for (int el : tab) { System.out.print(el + " "); } System.out.println(""); Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 15 / 69
Sortowanie danych całkowitych - Java II } } public static void main(string[] args) { Scanner in = new Scanner(System.in); System.out.println("Podaj rozmiar tablicy"); int n = in.nextint(); int[] intarr = new int[n]; generate (intarr,50); printtab (intarr); Arrays.sort(intArr); printtab (intarr); } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 16 / 69
java IntSorter Podaj rozmiar tablicy 20 8-21 -17-1 23 3 12-2 10-24 15 14 17-25 1-2 -11-6 -15 19-25 -24-21 -17-15 -11-6 -2-2 -1 1 3 8 10 12 14 15 17 19 23 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 17 / 69
Sortowanie danych rzeczywistych - Java I import java.util.random; import java.util.arrays; import java.util.scanner; public class DoubleSorter { public static void printtab(double[] tab) { for (double el : tab) { System.out.printf("%.04f %n", el); } } public static void main(string[] args) { Scanner in = new Scanner(System.in); System.out.println("Podaj rozmiar tablicy"); Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 18 / 69
Sortowanie danych rzeczywistych - Java II } } int n = in.nextint(); double[] tab = new double[n]; //losowo generowana tablica Random rand = new Random(); for (int j = 0; j < tab.length; ++j) { tab[j] = -100 + rand.nextdouble()*200; } printtab (tab); Arrays.sort(tab); System.out.println("Posortowane: "); printtab (tab); Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 19 / 69
java DoubleSorter Podaj rozmiar tablicy 10 29,0778-45,1843-85,2104-30,3586-11,7283-26,7103-1,6706 9,1219 58,6439 55,2431 Posortowane: -85,2104-45,1843-30,3586-26,7103-11,7283-1,6706 9,1219 29,0778 55,2431 58,6439 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 20 / 69
Sortowanie plików - Java I Źródło: https://algs4.cs.princeton.edu/25applications/ FileSorter.java import java.io.file; import java.util.arrays; import java.util.scanner; public class FileSorter { public static void main(string[] args) { File directory = new File(args[0]); if (!directory.exists()) { System.out.println(args[0] + " does not exist "); return; } if (!directory.isdirectory()) { Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 21 / 69
Sortowanie plików - Java II } System.out.println(args[0] + " is not a directory"); return; } File[] files = directory.listfiles(); if (files == null) { System.out.println("could not read files"); return; } Arrays.sort(files); for (int i = 0; i < files.length; i++) System.out.println(files[i].getName()); } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 22 / 69
java FileSorter./FileSorter./ FileSorter.class FileSorter.java Insertion.java StdIn.java StdOut.class StdOut.java babelkowe.cc binarne.cc insertsort.cc koktajlowe.cc quicksortfunction.c quicksort.c selectionsort.cc smplquicksort.cc Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 23 / 69
Sortowanie przez selekcję Sortowanie przez selekcję (proste wybieranie) polega na tym, że w każdym kroku znajdujemy najmniejszy (największy) element w sortowanym ciagu, po czym przenosimy ten element na odpowiednia pozycję do ciagu wynikowego (przez zamianę elementów miejscami). Metoda sortowania nazywa się przez selekcję, ponieważ działa na zasadzie ciagłego wybierania najmniejszego (największego) elementu z coraz mniejszego zbioru. Metoda sortowania jest niestabilna. Sortowanie odbywa się w n 1 przebiegach. W i-tym przebiegu szukamy i-tego najmniejszego (największego) elementu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 24 / 69
Sortowanie przez selekcję Require: tablica A o rozmiarze n {A=[0,...,n-1]} 1: for all i = 0 to n 1 do 2: min = i; 3: for all j = i + 1 to n 1 do 4: if A[j] < A[min] then 5: min = j; 6: end if 7: end for 8: zamiana (A[min], A[i]); 9: end for Ze względu na dwie zagnieżdżone pętle, z których każda wykonuje się dokładnie n razy, algorytm wymaga n n porównań, aby posortować n elementowy ciag, czyli jego ograniczenie górne jest w klasie O(n 2 ). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 25 / 69
Sortowanie przez selekcję - przykład Tablica po wypełnieniu pseudolosowymi wartosciami: -69 65-13 -78 4 27 10 96-24 35 Kolejne kroki algorytmu (element minimalny zaznaczony na czerwono, element, z którym nastapiła zamiana zaznaczony na niebiesko): i = 0: -78 65-13 -69 4 27 10 96-24 35 i = 1: -78-69 -13 65 4 27 10 96-24 35 i = 2: -78-69 -24 65 4 27 10 96-13 35 i = 3: -78-69 -24-13 4 27 10 96 65 35 i = 4: -78-69 -24-13 4 27 10 96 65 35 i = 5: -78-69 -24-13 4 10 27 96 65 35 i = 6: -78-69 -24-13 4 10 27 96 65 35 i = 7: -78-69 -24-13 4 10 27 35 65 96 i = 8: -78-69 -24-13 4 10 27 35 65 96 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 26 / 69
Sortowanie przez selekcję - Koszt algorytmu Złożoność czasowa: Operacja dominujaca: porównywanie elementów. Złożoność czasowa: Θ(n 2 ) T (n) = n 1 + n 2 +... + 2 + 1 + 0 = n (n 1) 2 = 1 2 n2 Czas sortowania niezależny od rodzaju danych wejściowych - czas pracy algorytmu jest kwadratowy, nawet jeśli wejście jest posortowane. Ruch danych jest minimalny - liniowa liczba operacji zamiany. Złożoność pamięciowa: Θ(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 27 / 69
Animacja https://www.toptal.com/developers/sorting-algorithms Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 28 / 69
Sortowanie przez wstawianie Algorytm sortowania nazywa się przez wstawianie, gdyż może być stosowany do sortowania kart, np. w czasie gry w pokera. Algorytm polega na sprawdzaniu kolejnych danych i szukaniu właściwego miejsca wśród wcześniej ułożonych dla nowej danej. Sortowanie przez wstawianie odbywa się w n 1 przebiegach. W i-tym przebiegu elementy na pozycjach 1,..., (i 1) sa już uporzadkowane, a wstawiany i-ty element przepycha się do przodu na właściwe miejsce, tak by stworzył wraz z innymi ciag uporzadkowany długości i. W implementacji należy zrobić miejsce na wstawienie bieżacego elementu, przenoszac większe (mniejsze) elementy o jedno miejsce w prawo przed wstawieniem danego na wolna pozycję. Metoda sortowania jest stabilna. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 29 / 69
Sortowanie przez wstawianie Require: tablica A o rozmiarze n {A=[0,...,n-1]} 1: for i = 1 to n 1 do 2: key = A[i]; 3: j = i 1; 4: while j 0 and key < A[j] do 5: A[j + 1] = A[j]; 6: j = j 1; 7: end while 8: A[j + 1] = key; 9: end for Ze względu na dwie zagnieżdżone pętle, z których każda wykonuje się dokładnie n razy, algorytm wymaga n n porównań, aby posortować n elementowy ciag, czyli jest w klasie O(n 2 ). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 30 / 69
Sortowanie przez wstawianie - Przykład Tablica po wypełnieniu pseudolosowymi wartosciami: -69 65-13 -78 4 27 10 96-24 35 Kolejne kroki algorytmu dla zewnętrznej pętli (ciag nieposortowany zaznaczony jest na czerwono, a element, który był rozważany w i-tym korku zaznaczony jest na niebiesko ): i = 1: -69 65-13 -78 4 27 10 96-24 35 i = 2: -69-13 65-78 4 27 10 96-24 35 i = 3: -78-69 -13 65 4 27 10 96-24 35 i = 4: -78-69 -13 4 65 27 10 96-24 35 i = 5: -78-69 -13 4 27 65 10 96-24 35 i = 6: -78-69 -13 4 10 27 65 96-24 35 i = 7: -78-69 -13 4 10 27 65 96-24 35 i = 8: -78-69 -24-13 4 10 27 65 96 35 i = 9: -78-69 -24-13 4 10 27 35 65 96 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 31 / 69
Sortowanie przez wstawianie - Koszt algorytmu Twerdzenie 6.2 a a Robert Sedgewick. Algorytmy w C++. Addison Wesley, Wydanie I, str. 252, 1999. W średnim przypadku sortowanie przez wstawianie wymaga N 2 /4 porównań i N 2 /4 przestawień dla losowo uporzadkowanej tablicy o długości N i niepowtarzalnych kluczach. W najgorszym przypadku sortowanie przez wstawianie wymaga N 2 /2 porównań i N 2 /2 przestawień. X T S R P O M L E E A W najlepszym przypadku sortowanie przez wstawianie wymaga N 1 porównań i 0 przestawień. A E E L M O P R S T X Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 32 / 69
Sortowanie przez wstawianie - Inwersja Inwersja Inwersja to para elementów tablicy uporzadkowanych w niewłaściwy sposób. Przykładowo w ciagu: A E E L M O T R X P S mamy 6 inversji: T R, T P T S, R P, X P, X S. W ciagu: E X A M P L E mamy 11 inversji: E A, X A, X M, X P, X L, X E, M L, M E, P L, P E i L E. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 33 / 69
Sortowanie przez wstawianie - częściowo posortowane tablice Tablica częściowo posortowana Tablica o rozmiarze N jest częściowo posortowana, jeśli liczba inwersji w tablicy jest mniejsza niż pewna stała wielokrotność jej wielkości, tj. liczba inwersji w tablicy jest c N. Przykłady częściowo posortowanych tablic: Tablica, w której każdy element znajduje się blisko ostatecznej pozycji. Krótka tablica dołaczona do długiej posortowanej tablicy. Tablica, w której mała liczba elementów znajduje się nie na właściwej pozycji. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 34 / 69
Sortowanie przez wstawianie - uwagi Czas wykonania sortowania przez wstawianie zależy od poczatkowego układu elementów w danych wejściowych. Sortowanie przez wstawianie zastosowane dla posortowanej tablicy stwierdzi natychmiastowo, że każdy element znajduje się we właściwym miejscu tablicy, a łaczny czas wykonania rośnie liniowo - czas wykonania sortowania przez wybieranie dla takich tablic jest kwadratowy. Sortowanie przez wstawianie (w odróżnieniu od sortowania przez wybieranie) jest wydajna metoda dla tablic częściowo posortowanych, a mianowicie algorytm sortowania przez wstawianie działa w czasie liniowym, a liczba przestawień jest równa liczbie inwersji. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 35 / 69
Sortowanie babelkowe Sortowanie babelkowe polega na zamienianiu miejscami kolejnych dwóch sasiaduj acych elementow tak długo, aż uzyska się uporzadkowany zbiór. Sortowanie babelkowe jest wykonywane w n 1 przebiegach. zewnetrznej pętli. W i-tym przebiegu wyznaczany jest i-ty najmniejszy/największy element zbioru oraz umieszczany jest na właściwej pozycji. Załóżmy, że zbiór przemierzamy od strony prawej do lewej, czyli od końca. Jeżeli w pierwszym przebiegu trafimy na najmniejszy (największy) element zbioru, zamieniamy go kolejno z elementami leżacymi po jego lewej stronie, aż trafi on na pierwsza pozycję w zbiorze. Jeżeli w drugim przebiegu trafimy na drugi najmniejszy (największy) element zbioru, zamieniamy go kolejno z elementami leżacymi po jego lewej stronie, aż trafi on na druga pozycję w zbiorze. itd. Metoda sortowania jest stabilna. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 36 / 69
Sortowanie babelkowe Require: tablica A o rozmiarze n {A=[0,...,n-1]} 1: for all i = 0 to n 1 do 2: for all j = n 1 downto j > i do 3: if A[j] < A[j 1] then 4: Zamiana(A[j 1], A[j]); 5: end if 6: end for 7: end for Ze względu na dwie zagnieżdżone pętle, z których każda wykonuje się dokładnie n razy, algorytm wymaga n n porównań, aby posortować n elementowy ciag, czyli jest w klasie O(n 2 ). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 37 / 69
Sortowanie babelkowe - Przykład I Tablica po wypełnieniu pseudolosowymi wartościami: 5 1 12-5 16 Kolejne kroki algorytmu - elementy wymagajace zamiany zaznaczone sa na czerwono, a element, które sa porównywane ale nie wymagaja zamiany zaznaczone sa na niebiesko: Iteracja i= 0 j = 4, 5 1 12-5 16, -5 < 16 - ok j = 3, 5 1-5 12 16, 12 > -5 - swap j = 2, 5-5 1 12 16, 1 > -5 - swap j = 1, -5 5 1 12 16, 5 > -5 - swap Iteracja i= 1 j = 4, -5 5 1 12 16, 12 < 16, ok j = 3, -5 5 1 12 16, 1 < 12, ok j = 2, -5 1 5 12 16, 5 > 1 - swap Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 38 / 69
Sortowanie babelkowe - Przykład II Iteracja i= 2 j = 4, -5 1 5 12 16, 12 < 16, ok j = 3, -5 1 5 12 16, 5 < 12, ok Iteracja i= 3 j = 4, -5 1 5 12 16, 12 < 16, ok Iteracja i= 4 Tablica po sortowaniu: -5 1 5 12 16 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 39 / 69
Wejście: 2 3 4 5 1, Rozmiar tablicy: 5 Iteracja i= 0 j = 4, 2 3 4 5 1 5>1 - swap j = 3, 2 3 4 1 5 4>1 - swap j = 2, 2 3 1 4 5 3>1 - swap j = 1, 2 1 3 4 5 2>1 - swap Iteracja i= 1 j = 4, 1 2 3 4 5 4<5 - ok j = 3, 1 2 3 4 5 3<4 - ok j = 2, 1 2 3 4 5 2<3 - ok Iteracja i= 2 j = 4, 1 2 3 4 5 4<5 - ok j = 3, 1 2 3 4 5 3<4 - ok Iteracja i= 3 j = 4, 1 2 3 4 5 4<5 - ok Iteracja i= 4 Tablica po sortowaniu: 1 2 3 4 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 40 / 69
Wejście: 6 1 2 3 4 5, Rozmiar tablicy: 6 I Iteracja i= 0 j = 5, 6 1 2 3 4 5 4<5 - ok j = 4, 6 1 2 3 4 5 3<4 - ok j = 3, 6 1 2 3 4 5 2<3 - ok j = 2, 6 1 2 3 4 5 1<2 - ok j = 1, 6 1 2 3 4 5 6>1 - swap Iteracja i= 1 j = 5, 1 6 2 3 4 5 4<5 - ok j = 4, 1 6 2 3 4 5 3<4 - ok j = 3, 1 6 2 3 4 5 2<3 - ok j = 2, 1 6 2 3 4 5 6>2 - swap Iteracja i= 2 j = 5, 1 2 6 3 4 5 4<5 - ok j = 4, 1 2 6 3 4 5 3<4 - ok j = 3, 1 2 6 3 4 5 6>3 - swap Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 41 / 69
Wejście: 6 1 2 3 4 5, Rozmiar tablicy: 6 II Iteracja i= 3 j = 5, 1 2 3 6 4 5 4<5 - ok j = 4, 1 2 3 6 4 5 6>4 - swap Iteracja i= 4 j = 5, 1 2 3 4 6 5 6>5 - swap Iteracja i= 5 Wyjście: 1 2 3 4 5 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 42 / 69
Sortowanie babelkowe 2 Zmodyfikowany algorytm sortowania babelkowego, którego wykonywanie kończy się z chwila stwierdzenia, że dany zbiór jest już posortowany. Require: tablica A o rozmiarze n {A=[0],...,A[n-1]} 1: zam = true; 2: i = 0; 3: while zam do 4: zam = false; 5: i = i + 1; 6: for j = 0 to j < n i do 7: if A[j] > A[j + 1] then 8: Zamiana(A[j], A[j + 1]); 9: zam = true; 10: end if 11: end for 12: end while Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 43 / 69
Wejście: 6 1 2 3 4 5, Rozmiar tablicy: 6 iteracja i= 0 j = 0, 6 1 2 3 4 5 6>1 - swap j = 1, 1 6 2 3 4 5 6>2 - swap j = 2, 1 2 6 3 4 5 6>3 - swap j = 3, 1 2 3 6 4 5 6>4 - swap j = 4, 1 2 3 4 6 5 6>5 - swap iteracja i= 1 j = 0, 1 2 3 4 5 6 1<2 - ok j = 1, 1 2 3 4 5 6 2<3 - ok j = 2, 1 2 3 4 5 6 3<4 - ok j = 3, 1 2 3 4 5 6 4<5 - ok Wyjście: 1 2 3 4 5 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 44 / 69
Wejście: 2 3 4 5 1, Rozmiar tablicy: 5 iteracja i= 0 j = 0, 2 3 4 5 1 2<3 - ok j = 1, 2 3 4 5 1 3<4 - ok j = 2, 2 3 4 5 1 4<5 - ok j = 3, 2 3 4 5 1 5>1 - swap iteracja i= 1 j = 0, 2 3 4 1 5 2<3 - ok j = 1, 2 3 4 1 5 3<4 - ok j = 2, 2 3 4 1 5 4>1 - swap iteracja i= 2 j = 0, 2 3 1 4 5 2<3 - ok j = 1, 2 3 1 4 5 3>1 - swap iteracja i= 3 j = 0, 2 1 3 4 5 2>1 - swap iteracja i= 4 Wyjście: 1 2 3 4 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 45 / 69
Sortowanie babelkowe - Koszt algorytmu Twerdzenie 6.3 a a Robert Sedgewick. Algorytmy w C++. Addison Wesley, Wydanie I, str. 252, 1999. W średnim i najgorszym przypadku sortowanie babelkowe wymaga N 2 /2 porównań i N 2 /2 przestawień dla losowo uporzadkowanej tablicy o długości N. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 46 / 69
Sortowanie koktajlowe Sortowanie koktajlowe - znane także jako dwukierunkowe sortowanie babelkowe, sortowanie przez wstrzasanie (ang. cocktail sort, bidirectional bubble sort, shaker sort). Sortowanie koktajlowe jest wersja sortowania babelkowego w którym prześcia przez dane odbywaja się na przemian: raz z lewa na prawo, raz z prawa na lewo. Sortowanie koktajlowe wykorzystuje następujace własności: Każdy obieg wewnętrznej pętli sortujacej umieszcza na właściwym miejscu element najmniejszy, a elementy większe przesuwa o 1 pozycje w kierunku końca zbioru. Jeśli pętla wewnętrzn zostanie wykonana w kierunku odwrotnym, to wtedy największy element znajdzie się na swoim właściwym miejscu, a elementy mniejsze przesuna się o jedna pozycję w kierunku poczatku zbioru. Łaczac te dwie pętle, sortujac wewnętrznie naprzemiennie w kierunku normalnym i odwrotnym, otrzymujemy algorytm sortowania koktajlowego. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 47 / 69
Sortowanie koktajlowe vs babelkowe: A= {2,3,4,5,1} Sortowanie koktajlowe - wymaga tylko dwa przejścia, aby posortować ciag 2,3,4,5,1 iteracja i1 top --> down i = 4, 2 3 4 5 1, 5>1 - swap i = 3, 2 3 4 1 5, 4>1 - swap i = 2, 2 3 1 4 5, 3>1 - swap i = 1, 2 1 3 4 5, 2>1 - swap iteracja i2 down --> top i = 1, 1 2 3 4 5, 1<2 - ok i = 2, 1 2 3 4 5, 2<3 - ok i = 3, 1 2 3 4 5, 3<4 - ok Wyjście: 1 2 3 4 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 48 / 69
Sortowanie koktajlowe vs babelkowe: A= {2,3,4,5,1} Sortowanie babelkowe - wymaga cztery przejścia, aby posortować ciag 2,3,4,5,1 Iteracja i= 0 j = 4, 2 3 4 5 1 5>1 - swap j = 3, 2 3 4 1 5 4>1 - swap j = 2, 2 3 1 4 5 3>1 - swap j = 1, 2 1 3 4 5 2>1 - swap Iteracja i= 1 j = 4, 1 2 3 4 5 4<5 - ok j = 3, 1 2 3 4 5 3<4 - ok j = 2, 1 2 3 4 5 2<3 - ok Iteracja i= 2 j = 4, 1 2 3 4 5 4<5 - ok j = 3, 1 2 3 4 5 3<4 - ok Iteracja i= 3 j = 4, 1 2 3 4 5 4<5 - ok Iteracja i= 4 Wyjście: 1 2 3 4 5 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 49 / 69
Sortowanie koktajlowe Algorytm: ShakerSort tablica A o rozmiarze n {A=[0,...,n-1]} 1: bottom = 0; top = n - 1; 2: bool zamiana = true; 3: while zamiana do 4: zamiana = false; 5: for all i = top to i > bottom do 6: if A[i] < A[i 1] then 7: zamien(a[i], A[i 1]); 8: zamiana = true; i = i 1; 9: end if 10: end for 11: zamiana = false; bottom = bottom + 1; 12: for all i = bottom to i < top do 13: if A[i] > A[i + 1] then 14: zamien(a[i], A[i + 1]); 15: zamiana = true; i = i + 1; 16: end if 17: end for 18: top = top 1; 19: end while Twierdzenie W średnim i najgorszym przypadku sortowanie koktajlowe wymaga N 2 /2 porównań i N 2 /2 przestawień dla losowo uporzadkowanej tablicy o długości N. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 50 / 69
Metoda dziel i zwyciężaj Idea Metoda dziel i zwyciężaj (ang. divide and conquer) jest metoda projektowania algorytmów, w której dany problem jest dzielony na kilka mniejszych podproblemów podobnych do poczatkowego problemu. Problemy te sa rozwiazywane rekurencyjnie, a następnie rozwiazania wszystkich podproblemów sa łaczone w celu utworzenia rozwiazania całego problemu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 51 / 69
Metoda dziel i zwyciężaj W podejściu dziel i zwyciężaj każdy poziom rekursji składa się z następujacych trzech etapów: Dziel: Dzielimy problem na podproblemy. Zwyciężaj: Rozwiazujemy podproblemy rekurencyjnie, chyba że sa one małego rozmiaru i już nie wymagaja zastosowania rekursji - używamy wtedy bezpośrednich metod. Połacz: Łaczymy rozwiazania podproblemów, aby otrzymać rozwiazanie całego problemu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 52 / 69
Dziel i Zwyciężaj - przykłady zastosowań Znajdowanie największego i najmniejszego elementu zbioru. Wyszukiwanie binarne Potęgowanie liczb Sortowanie szybkie Sortowanie przez scalanie Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 53 / 69
Element minimalny i maksymalny zbioru Definicja problemu: Dane: n - liczba elementów zbioru a 1, a 2, a 3,..., a n - ciag elementów Szukane: Elementy największy (maksymalny) i najmniejszy (minimalny) zbioru, (w skrócie, elementy min i max zbioru). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 54 / 69
Elementy min i max zbioru - podejście siłowe Dane: Tablica A o rozmiarze n, tj.a= A[0],...,A[n-1] Algorytm: MIN 1: min = A[0]; 2: for i = 1 to n 1 do 3: if min > A[i] then 4: min = A[i]; 5: end if 6: end for 7: return min; Algorytm: MAX 1: max = A[0]; 2: for i = 1 to n 1 do 3: if max < A[i] then 4: max = A[i]; 5: end if 6: end for 7: return max; Naiwne rozwiazanie problemu: Najpierw wyszukujemy element największy metoda bezpośrednia, a potem element najmniejszy. Złożoność obliczeniowa: 2 n Algorytm MAX : n - 1 operacji porównania Algorytm MIN : n - 1 operacji porównania Razem MAX i MIN : 2n - 2 operacji porównania Przykład, zbiór 9-elementowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Liczba porównań: 16 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 55 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Wykorzystujemy następujac a własność zbiorów skończonych: W każdym zbiorze skończonym zawsze znajduje się element największy i element najmniejszy. Znajdujemy kandydatów na Min i Max - takie wyszukanie realizowane jest poprzez porównywanie elementów parami. Stosujemy algorytmy MIN i MAX na odpowiednim zbiorze kandydatów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 56 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 57 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 57 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 57 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Kandydaci na MAX: 5, 3, 9, 5, 4. Na tym zbiorze stosowany jest algorytm MAX. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 57 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Przykład: Zbiór wejściowy: 2, 5, 3, 1, 8, 9, 1, 5, 4 Porównywanie parami: 2 < 5, 3 < 1, 8 < 9, 1 < 5, 4 Kandydaci na MIN: 2, 1, 8, 1, 4. Na tym zbiorze stosowany jest algorytm MIN. Kandydaci na MAX: 5, 3, 9, 5, 4. Na tym zbiorze stosowany jest algorytm MAX. Ostatni - nieparzysty element został dodany do obu zbiorów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 57 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Szacowanie: Przy rozdzielaniu elementów wykonano 4 porównania. Algorytm MIN na zbiorze {2, 1, 8, 1, 4} wykonał 4 porównania i zwrócił wartość 1. Algorytm MAX na zbiorze {5, 3, 9, 5, 4} wykonał 4 porównania i zwrócił wartość 9. W sumie wykonano 4 + 4 + 4 = 12 porównań, co oznacza 25% wzrost wydajności w porównaniu z podejściem naiwnym (tam potrzebnych było 16 porównań)! Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 58 / 69
Element min i max zbioru - metoda dziel i zwyciężaj Dane: tablica A o rozmiarze n, tj. A = A[0],..., A[n 1] Algorytm: MIN-MAX 1: min = 0; max = 0; 2: for i = 0 to n 2 do 3: if A[i] < A[i + 1] then 4: if A[i] < A[min] then 5: min = i; 6: end if 7: if A[i + 1] > A[max] then 8: max = i + 1; 9: end if 10: else 11: if A[i + 1] < A[min] then 12: min = i + 1; 13: end if 14: if A[i] > A[max] then 15: max = i; 16: end if 17: end if 18: i = i + 2; 19: end for 20: if n is odd then 21: if A[n 1] < A[min] then 22: min = n 1; 23: end if 24: if A[n 1] > A[max] then 25: max = n 1; 26: end if 27: end if 28: return A[min] and A[max]; Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 59 / 69
Dziel i Zwyciężaj - przykłady zastosowań Znajdowanie największego i najmniejszego elementu zbioru Wyszukiwanie binarne Potęgowanie liczb Sortowanie szybkie Sortowanie przez scalanie Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 60 / 69
Wyszukiwanie binarne Problem: Dany jest posortowany zbiór danych (np. w tablicy) Arr oraz pewien element key. Należy odpowiedzieć na pytanie czy klucz key znajduje się w tablicy Arr. Algorytm: Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. Jeśli środkowy element jest większy niż key, to szukaj elementu key w lewej części tablicy. Jeśli środkowy element jest mniejszy niż key, to szukaj elementu key w prawej części tablicy. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 61 / 69
Wyszukiwanie binarne Przykład: Znaleźć liczbę 9 w ciagu: 3, 5, 7, 8, 9, 12, 15. 3 5 7 8 9 12 15 3 5 7 8 9 12 15 3 5 7 8 9 12 15 3 5 7 8 9 12 15 3 5 7 8 9 12 15 3 5 7 8 9 12 15 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 62 / 69
Wyszukiwanie binarne Algorytm bisekcji (A,n,key): 1: i = 0; j = n 1; 2: while (i j) do 3: mid = i + (j i)/2; 4: if key < A[mid] then 5: j = mid 1; 6: else 7: if key > A[mid] then 8: i = mid + 1; 9: else 10: return mid; 11: end if 12: end if 13: end while 14: return 1; Złożoność algorytmu: Θ(log 2 (n)). Uzasadnienie - patrz wykład 2. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 63 / 69
Wyszukiwanie binarne - algorytm rekurencyjny Algorytm bisekcja2 (A,left, right, key): 1: if left > right then 2: return 1; 3: end if 4: curr = left + (right left)/2; 5: if key < a[curr] then 6: bisekcja2(a, left, curr 1, key); 7: else 8: if key > a[curr] then 9: bisekcja2(a, curr + 1, right, key); 10: else 11: return curr; 12: end if 13: end if Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 64 / 69
Twierdzenie 1 Cormen T.H., Leiserson Ch.E., Rivest R.L. Wprowadzenie do algorytmów, Roz. 4 (str. 73) T (n) = a T (n/b) + f (n) n - rozmiar problemu; rozmiar danych wejściowych. a - liczba podproblemów w rekurencji. n/b - rozmiar każdego podproblemu; w zasadzie zakłada się, że wszystkie podproblemy sa tego samego rozmiaru. f(n) - koszt operacji poza rekurencyjnym wywołaniem zawierajacy koszt podziału probelmu na podproblemy i koszt operacji scalenia rozwiazań. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 65 / 69
Wyszukiwanie binarne - złożoność rozmiar danych wejściowych: n liczba podproblemów w rekurencji: a = 1 rozmiar podproblemu (połowa danych) n/b = n/2 koszt operacji poza rekurencyjnych (sprawdzenie elementu środkowego, połaczenie wyniku): Θ(1) co implikuje: T (n) = T (n/2) + 1 T (n) = Θ(log 2 (n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 66 / 69
Dziel i Zwyciężaj - przykłady zastosowań Znajdowanie największego i najmniejszego elementu zbioru. Wyszukiwanie binarne Potęgowanie liczb Sortowanie szybkie Sortowanie przez scalanie Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 67 / 69
Potęgowanie liczby Problem: Oblicz a n, dla n N. Algorytm naiwny: a n = a a... a }{{} n Złożoność: Θ(n) Algorytm dziel i zwyciężaj: { a n a n/2 a = n/2, gdy n jest parzyste a n 1/2 a n 1/2 a, gdy n jest nieparzyste Złożoność: T (n) = T (n/2) + Θ(1) θ(log 2 (n)) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 68 / 69
Dziel i Zwyciężaj - przykłady zastosowań Znajdowanie największego i najmniejszego elementu zbioru. Wyszukiwanie binarne Potęgowanie liczb Sortowanie szybkie - Następny wykład Sortowanie przez scalanie Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 4 69 / 69