Algorytmy i Struktury Danych. Organizacja wykładu. Problem Sortowania. Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 1 / 35
Na całym cyklu wykładów z Algorytmów i Struktur Danych wykorzystano materiały dostępne z następujacych witryn: http://wazniak.mimuw.edu.pl/ http://ocw.mit.edu/courses/ Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 2 / 35
Literatura podstawowa Cormen T.H., Leiserson Ch.E., Rivest R.L. Wprowadzenie do algorytmów. WNT, Warszawa, 1997. Dasgupta S., Papadimitriou Ch., Vasirani U. Algorytmy. Wydawnictwo Naukowe PWN, Seria Fundamenta Informatyki, Warszawa 2010. Banachowski L., Diks K., Rytter W. Algorytmy i struktury danych. WNT, Warszawa, 1996. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 3 / 35
Literatura uzupełniajaca Drozdek A. C++. Algorytmy i struktury danych. Wydawnictwo Helion. Gliwice, 2004. Sedgewick R. Algorytmy w C++. Wydawnictwo RM. Warszawa, 1999. Sedgewick R. Algorytmy w C++. Grafy. Wydawnictwo RM. Warszawa, 2003. Piotr Wróblewski. Algorytmy, struktury danych i techniki programowania. Wydanie III. Wydawnictwo Helion. Gliwice, 2003. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 4 / 35
Cel wykładów z algortmów i struktur danych Wykład jest poświęcony przede wszystkim metodom efektywnego rozwiazywania problemów na komputerze. Jego celem jest zapoznanie z: podstawami analizy algorytmów dobór właściwego algorytmu i struktury danych jest podstawa sukcesu przy rozwiazywaniu zadanego problemu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 5 / 35
Cel wykładów z algortmów i struktur danych Wykład jest poświęcony przede wszystkim metodom efektywnego rozwiazywania problemów na komputerze. Jego celem jest zapoznanie z: podstawami analizy algorytmów dobór właściwego algorytmu i struktury danych jest podstawa sukcesu przy rozwiazywaniu zadanego problemu. technikami projektowania algorytmów: dziel i rzadź, programowanie dynamiczne, algorytmy zachłanne, przeszukiwanie z nawrotami, heurystyki. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 5 / 35
Cel wykładów z algortmów i struktur danych Wykład jest poświęcony przede wszystkim metodom efektywnego rozwiazywania problemów na komputerze. Jego celem jest zapoznanie z: podstawami analizy algorytmów dobór właściwego algorytmu i struktury danych jest podstawa sukcesu przy rozwiazywaniu zadanego problemu. technikami projektowania algorytmów: dziel i rzadź, programowanie dynamiczne, algorytmy zachłanne, przeszukiwanie z nawrotami, heurystyki. zestawem algorytmów realizujacych zadania typu wyszukiwanie, sortowanie. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 5 / 35
Cel wykładów z algortmów i struktur danych Wykład jest poświęcony przede wszystkim metodom efektywnego rozwiazywania problemów na komputerze. Jego celem jest zapoznanie z: podstawami analizy algorytmów dobór właściwego algorytmu i struktury danych jest podstawa sukcesu przy rozwiazywaniu zadanego problemu. technikami projektowania algorytmów: dziel i rzadź, programowanie dynamiczne, algorytmy zachłanne, przeszukiwanie z nawrotami, heurystyki. zestawem algorytmów realizujacych zadania typu wyszukiwanie, sortowanie. z abstrakcyjnymi strukturami danych i ich implementacjami: stosy, kolejki, listy, drzewa, drzewa poszukiwań binarnych, grafy, kolejki priorytetowe. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 5 / 35
Cel wykładów z algortmów i struktur danych Wykład jest poświęcony przede wszystkim metodom efektywnego rozwiazywania problemów na komputerze. Jego celem jest zapoznanie z: podstawami analizy algorytmów dobór właściwego algorytmu i struktury danych jest podstawa sukcesu przy rozwiazywaniu zadanego problemu. technikami projektowania algorytmów: dziel i rzadź, programowanie dynamiczne, algorytmy zachłanne, przeszukiwanie z nawrotami, heurystyki. zestawem algorytmów realizujacych zadania typu wyszukiwanie, sortowanie. z abstrakcyjnymi strukturami danych i ich implementacjami: stosy, kolejki, listy, drzewa, drzewa poszukiwań binarnych, grafy, kolejki priorytetowe. podstawowymi algorytmami grafowymi. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 5 / 35
Cel wykładów z algortmów i struktur danych Wykład jest poświęcony przede wszystkim metodom efektywnego rozwiazywania problemów na komputerze. Jego celem jest zapoznanie z: podstawami analizy algorytmów dobór właściwego algorytmu i struktury danych jest podstawa sukcesu przy rozwiazywaniu zadanego problemu. technikami projektowania algorytmów: dziel i rzadź, programowanie dynamiczne, algorytmy zachłanne, przeszukiwanie z nawrotami, heurystyki. zestawem algorytmów realizujacych zadania typu wyszukiwanie, sortowanie. z abstrakcyjnymi strukturami danych i ich implementacjami: stosy, kolejki, listy, drzewa, drzewa poszukiwań binarnych, grafy, kolejki priorytetowe. podstawowymi algorytmami grafowymi. problemami obliczeniowo trudnymi: NP-zupełność, nierozstrzygalność. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 5 / 35
Dlaczego warto poznać algorytmy i ich złożoność obliczeniowa? Algorytmy pozwalaja na pisanie dobrych programów, tzn. programów, które działaja poprawnie i wydajne, sa funkcjonalne, zużywaja tylko konieczna liczbę zasobów, itp. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 6 / 35
Dlaczego warto poznać algorytmy i ich złożoność obliczeniowa? Algorytmy pozwalaja na pisanie dobrych programów, tzn. programów, które działaja poprawnie i wydajne, sa funkcjonalne, zużywaja tylko konieczna liczbę zasobów, itp. Algorytmy pozwalaja w sposób formalny mówić o zachowaniu programów implementowanych w różnych językach programowania. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 6 / 35
Dlaczego warto poznać algorytmy i ich złożoność obliczeniowa? Algorytmy pozwalaja na pisanie dobrych programów, tzn. programów, które działaja poprawnie i wydajne, sa funkcjonalne, zużywaja tylko konieczna liczbę zasobów, itp. Algorytmy pozwalaja w sposób formalny mówić o zachowaniu programów implementowanych w różnych językach programowania. Najważniejszymi aspektami algorytmu sa jego poprawność i złożoność obliczeniowa. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 6 / 35
Dlaczego warto poznać algorytmy i ich złożoność obliczeniowa? Algorytmy pozwalaja na pisanie dobrych programów, tzn. programów, które działaja poprawnie i wydajne, sa funkcjonalne, zużywaja tylko konieczna liczbę zasobów, itp. Algorytmy pozwalaja w sposób formalny mówić o zachowaniu programów implementowanych w różnych językach programowania. Najważniejszymi aspektami algorytmu sa jego poprawność i złożoność obliczeniowa. Złożoność obliczeniowa algorytmu wyznacza granice pomiędzy tym co jest możliwe do wykonania/ zaimplementowania/ zastosowania w rzeczywistości, a co nie. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 6 / 35
Dlaczego warto poznać algorytmy i ich złożoność obliczeniowa? Algorytmy pozwalaja na pisanie dobrych programów, tzn. programów, które działaja poprawnie i wydajne, sa funkcjonalne, zużywaja tylko konieczna liczbę zasobów, itp. Algorytmy pozwalaja w sposób formalny mówić o zachowaniu programów implementowanych w różnych językach programowania. Najważniejszymi aspektami algorytmu sa jego poprawność i złożoność obliczeniowa. Złożoność obliczeniowa algorytmu wyznacza granice pomiędzy tym co jest możliwe do wykonania/ zaimplementowania/ zastosowania w rzeczywistości, a co nie. Złożoność obliczeniowa algorytmu to koszt jego realizacji. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 6 / 35
Złożoność algorytmu Definicja Złożoność algorytmu to ilość zasobów komputera niezbędnych do jego wykonania. W zależności od rozważanego zasobu złożoność dzielimy na złożoność czasową oraz złożoność pamięciowa. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 7 / 35
Złożoność algorytmu Definicja Złożoność algorytmu to ilość zasobów komputera niezbędnych do jego wykonania. W zależności od rozważanego zasobu złożoność dzielimy na złożoność czasową oraz złożoność pamięciowa. Złożoność czasowa to zależność pomiędzy rozmiarem danych wejściowych a liczba operacji elementarnych (operacji dominujacych) wykonywanych w trakcie przebiegu algorytmu. Operacjami dominujacymi moga być na przykład: podstawienie, porównanie lub prosta operacja arytmetyczna. Dzięki rozważaniu operacji dominujacych analiza złożoności będzie zależna jedynie od algorytmu, a nie od jego implementacji i sprzętu. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 7 / 35
Złożoność algorytmu Złożoność pamięciowa to zależność pomiędzy rozmiarem danych wejściowych a ilośca wykorzystanej pamięci. Jako tę ilość najczęściej przyjmuje się użyta pamięć maszyny abstrakcyjnej (na przykład liczbę komórek pamięci maszyny RAM) w funkcji rozmiaru wejścia. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 8 / 35
Złożoność algorytmu Złożoność pamięciowa to zależność pomiędzy rozmiarem danych wejściowych a ilośca wykorzystanej pamięci. Jako tę ilość najczęściej przyjmuje się użyta pamięć maszyny abstrakcyjnej (na przykład liczbę komórek pamięci maszyny RAM) w funkcji rozmiaru wejścia. Im większe rozmiary danych wejściowych tym więcej zasobów (czasu, pamięci) jest koniecznych do wykonania danego algorytmu. Złożoność algorytmu jest zatem funkcja rozmiaru danych wejściowych. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 8 / 35
Złożoność algorytmu Złożoność pamięciowa to zależność pomiędzy rozmiarem danych wejściowych a ilośca wykorzystanej pamięci. Jako tę ilość najczęściej przyjmuje się użyta pamięć maszyny abstrakcyjnej (na przykład liczbę komórek pamięci maszyny RAM) w funkcji rozmiaru wejścia. Im większe rozmiary danych wejściowych tym więcej zasobów (czasu, pamięci) jest koniecznych do wykonania danego algorytmu. Złożoność algorytmu jest zatem funkcja rozmiaru danych wejściowych. Złożoność algorytmu zależy nie tylko od rozmiaru ciagu wejściowego (krótke ciagi jest znacznie łatwiej posortować niż długie) ale również od rodzaju wejścia (prawie uporzadkowany ciag jest znacznie łatwiej posortować). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 8 / 35
Rodzaje złożoności W praktyce rozważa się dwa podejścia: rozpatrywanie przypadków najgorszych (złożoność pesymistyczna) oraz zastosowanie określonego sposobu uśrednienia wszystkich możliwych przypadków (złożoność oczekiwana). Złożoność pesymistyczna (ang. worst-case): T(n) = maksymalna ilość zasobu (pamięć, czas) potrzebna do wykonania algorytmu dla dowolnego wejścia o rozmiarze n. Złożoność oczekiwana (ang. average-case): T(n) = oczekiwana ilość zasobu (pamięć, czas) potrzebna do wykonania algorytmu dla dowolnego wejścia o rozmiarze n. Złożoność oczekiwana zależy istotnie od założenia o rozważanej przestrzeni probabilistycznej danych wejściowych. Przestrzeń probabilistyczna danych wejściowych może być bardzo skomplikowana, co powoduje, że wyznaczenie złożoności oczekiwanej wymaga bardzo trudnych analiz matematycznych. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 9 / 35
Notacja asymptotyczna Do wyrażania złożoności stosowany jest opis asymptotycznego wzrostu funkcji: f(n) = O(g(n)) oznaczajacy, że f(n) c g(n) dla pewnej stałej c. Gdy g(n) = log(n), to mówimy, że f(n) jest logarytmiczna. Gdy g(n) = n, to mówimy, że f(n) jest liniowa. Gdy g(n) = n log(n), to mówimy, że f(n) jest liniowao-logarytmiczna. Gdy g(n) = n 2, to mówimy, że złożoność f(n) jest kwadratowa. Jeśli g(n) jest wielomianem, to mówimy o złożoności wielomianowej dla f(n). Jeśli g(n) jest wykładnicza, to mówimy o złożoności wykładniczej dla f(n). Jeśli g(n) jest silnie wykładnicza, to mówimy o złożoności silnie wykładniczej dla f(n). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 10 / 35
Notacja asymptotyczna Funkcja asymptotycznie niemniejsza od funkcji g(n) to taka funkcja f : N R, dla której istnieja c > 0 i n 0 N, że c g(n) f(n) dla wszystkich n n 0. Zbiór funkcji asymptotycznie niemniejszych niż g(n) oznaczamy przez Ω(g(n)). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 11 / 35
Notacja asymptotyczna Funkcja asymptotycznie niemniejsza od funkcji g(n) to taka funkcja f : N R, dla której istnieja c > 0 i n 0 N, że c g(n) f(n) dla wszystkich n n 0. Zbiór funkcji asymptotycznie niemniejszych niż g(n) oznaczamy przez Ω(g(n)). Funkcja asymptotycznie podobna do funkcji g(n) to taka funkcja f : N R, dla której istnieja c 0, c 1 > 0 i n 0 N, że c 0 g(n) f(n) c 1 g(n) dla wszystkich n n 0. Zbiór funkcji asymptotycznie podobnych do g(n) oznaczamy przez Θ(g(n)). A zatem Θ(g(n)) = O(g(n)) Ω(g(n)). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 11 / 35
Notacja asymptotyczna Funkcja asymptotycznie niemniejsza od funkcji g(n) to taka funkcja f : N R, dla której istnieja c > 0 i n 0 N, że c g(n) f(n) dla wszystkich n n 0. Zbiór funkcji asymptotycznie niemniejszych niż g(n) oznaczamy przez Ω(g(n)). Funkcja asymptotycznie podobna do funkcji g(n) to taka funkcja f : N R, dla której istnieja c 0, c 1 > 0 i n 0 N, że c 0 g(n) f(n) c 1 g(n) dla wszystkich n n 0. Zbiór funkcji asymptotycznie podobnych do g(n) oznaczamy przez Θ(g(n)). A zatem Θ(g(n)) = O(g(n)) Ω(g(n)). Przykłady: 1 100 n2 2n = Θ(n 2 ) 3n 3 + 90n 2 5n+6046 = Θ(n 3 ) n 5 + 2 n = Θ(2 n ) n! = Ω(10 n ) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 11 / 35
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 1 12 / 35
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 ). Przykład Wejście: 8 2 4 9 3 6 Wyjście: 2 3 4 6 8 9 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 12 / 35
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 ). Przykład Wejście: 8 2 4 9 3 6 Wyjście: 2 3 4 6 8 9 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. Jedynym sposobem ustalenie porzadku jest porównywanie elementów parami. Operacja porównania będzie operacja dominujac a w wszystkich naszych algorytmach sortujacych. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 12 / 35
Popularne algorytmy sortowania Sortowanie przez porównywanie elementów: Sortowanie przez proste wybieranie (ang. selection sort) Sortowanie przez wstawianie (ang. insertion sort) Sortowanie babelkowe (ang. bubblesort) Sortowanie pozycyjne (ang. radix sort) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 13 / 35
Popularne algorytmy sortowania Sortowanie przez porównywanie elementów: Sortowanie przez proste wybieranie (ang. selection sort) Sortowanie przez wstawianie (ang. insertion sort) Sortowanie babelkowe (ang. bubblesort) Sortowanie pozycyjne (ang. radix sort) Sortowanie metoda dziel i zwyciężaj Sortowanie przez scalanie (ang. merge sort) sortowanie szybkie (ang. quicksort) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 13 / 35
Popularne algorytmy sortowania Sortowanie przez porównywanie elementów: Sortowanie przez proste wybieranie (ang. selection sort) Sortowanie przez wstawianie (ang. insertion sort) Sortowanie babelkowe (ang. bubblesort) Sortowanie pozycyjne (ang. radix sort) Sortowanie metoda dziel i zwyciężaj Sortowanie przez scalanie (ang. merge sort) sortowanie szybkie (ang. quicksort) Inne Sortowanie przez zliczanie (ang. counting sort) sortowanie przez kopcowanie (ang. heapsort) Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 13 / 35
Sortowanie przez proste wybieranie Idea Sortowanie przez wybieranie polega na tym, że w każdym kroku znajdujemy najmniejszy element w sortowanym ciagu, po czym przenosimy ten element na odpowiednią pozycję do ciagu wynikowego (przez zamianę elementów miejscami). 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 1 14 / 35
Sortowanie przez proste wybieranie Require: tablica A o rozmiarze n {A=[0,...,n-1]} 1: for all i = 0 to n 2 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: j = j + 1; 8: end for {zamiana elementu A[min] z elementem A[i] w tablicy A} 9: zamiana (A, min, i); 10: i = i + 1; 11: 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 1 15 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 jest na właściwej pozycji Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 jest na właściwej pozycji 2 [0,1,6,8,4,3,2,9] 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 jest na właściwej pozycji 2 [0,1,6,8,4,3,2,9] 2 3 [0,1,2,8,4,3,6,9] 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 jest na właściwej pozycji 2 [0,1,6,8,4,3,2,9] 2 3 [0,1,2,8,4,3,6,9] 3 4 [0,1,2,3,4,8,6,9] 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 jest na właściwej pozycji 2 [0,1,6,8,4,3,2,9] 2 3 [0,1,2,8,4,3,6,9] 3 4 [0,1,2,3,4,8,6,9] 4 5 [0,1,2,3,4,8,6,9] 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 jest na właściwej pozycji 2 [0,1,6,8,4,3,2,9] 2 3 [0,1,2,8,4,3,6,9] 3 4 [0,1,2,3,4,8,6,9] 4 5 [0,1,2,3,4,8,6,9] 6 6 [0,1,2,3,4,6,8,9] 8 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład nr iteracji (wartość i ) Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 jest na właściwej pozycji 2 [0,1,6,8,4,3,2,9] 2 3 [0,1,2,8,4,3,6,9] 3 4 [0,1,2,3,4,8,6,9] 4 5 [0,1,2,3,4,8,6,9] 6 6 [0,1,2,3,4,6,8,9] 8 7 [0,1,2,3,4,6,8,9] 9 jest na właściwej pozycji Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 16 / 35
Sortowanie przez proste wybieranie - Przykład K r o k i a l g o r y t m u Klucze i = 2 i = 3 i = 4 i = 5 i = 6 44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 12 55 42 94 18 44 67 06 12 18 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 17 / 35
Sortowanie przez proste wybieranie - Koszt algorytmu Złożoność pesymistyczna: Operacja dominujaca: porównywanie elementów. Wejście: ciag uporzadkowany w odwrotnej kolejności. Koszt: T(n) = n 1+n 2+...+2+1 = n(n 1)/2 = O(n 2 ) Złożoność optymistyczna: Operacja dominujaca: porównywanie elementów. Wejście: wszystkie permutacje ciagu wejściowego równie prawdopodobne. Koszt: O(n 2 ). Złożoność pamięciowa: O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 18 / 35
Sortowanie przez proste wybieranie - implementacja w C/C++ void swap ( i n t data [ ], i n t i, i n t j ) { i n t temp = data [ i ] ; data [ i ] = data [ j ] ; data [ j ] = temp ; } i n t max( i n t [ ] a, i n t n ) { i n t currentmax = 0; for ( i n t i = 1; i <= n ; i ++) i f ( a [ currentmax ] < a [ i ] ) currentmax = i ; return currentmax ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 19 / 35
Sortowanie przez proste wybieranie - implementacja w C/C++ void s e l e c t i o n S o r t ( i n t [ ] a, i n t s ize ) { for ( i n t n = s ize ; n > 1; n ) { i n t j = max ( a, n 1); swap ( a, j, n 1 ) ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 20 / 35
Sortowanie przez proste wybieranie - implementacja w C/C++ void s e l e c t i o n S o r t ( i n t a [ ], i n t s ize ) { i n t i, j, min, temp ; for ( i = 0; i < size 1; i ++) { min = i ; for ( j = i +1; j < s ize ; j ++) { i f ( a [ j ] < a [ min ] ) min = j ; } temp = a [ i ] ; a [ i ] = a [ min ] ; a [ min ] = temp ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 21 / 35
Sortowanie przez wstawianie Idea 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. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 22 / 35
Sortowanie przez wstawianie - przykład 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 2 3 4 6 8 9 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 23 / 35
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 A[j] > key 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 1 24 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 [1,3,4,6,8,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 [1,3,4,6,8,9,2,0] 3 6 [1,2,3,4,6,8,9,0] 2 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 [1,3,4,6,8,9,2,0] 3 6 [1,2,3,4,6,8,9,0] 2 7 [1,2,3,4,6,8,9,0] 0 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 25 / 35
Sortowanie przez wstawianie - przykład K r o k i a l g o r y t m u Klucze i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 44 55 12 42 94 18 06 67 44 55 12 42 94 18 06 67 12 44 55 42 94 18 06 67 12 42 44 55 94 18 06 67 12 42 44 55 94 18 06 67 12 18 42 44 55 94 06 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 26 / 35
Sortowanie przez wstawianie - Koszt algorytmu Złożoność pesymistyczna: Operacja dominujaca: porównywanie elementów. Wejście: ciag uporzadkowany w odwrotnej kolejności. Koszt: T(n) = 1+2+3+...+n 1 = n(n 1)/2 = O(n 2 ) Złożoność optymistyczna: Operacja dominujaca: porównywanie elementów. Wejście: wszystkie permutacje ciagu wejściowego równie prawdopodobne. Koszt: O(n 2 ). Złożoność pamięciowa: O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 27 / 35
Sortowanie przez wstawianie - implementacja w C/C++ void i n s e r t ( i n t [ ] a, i n t n, i n t x ) { / / i n s e r t x i n t o a [ 0.. i 1] i n t j ; for ( j = i 1; j >= 0 && x < a [ j ] ; j ) a [ j + 1] = a [ j ] ; a [ j + 1] = x ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 28 / 35
Sortowanie przez wstawianie - implementacja w C/C++ void i n s e r t S o r t ( i n t [ ] a, i n t n ) { for ( i n t i = 1; i < n ; i ++) { / / i n s e r t a [ i ] i n t o a [ 0 : i 1] i n s e r t ( a, i, a [ i ] ) ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 29 / 35
Sortowanie babelkowe W sortowaniu babelkowym liczby zachowuja się jak babelki, po kolei, jedna po drugiej ida do góry (lub w prawo). Sortowanie babelkowe jest wykonywane w n 1 fazach. W fazie i-tej wyznaczany jest i-ty najmniejszy/największy element. Idea Sprawdzamy cały ciag od końca. Jeżeli trafimy na parę elementów, w której większy poprzedza mniejszy, to zamieniamy je miejscami. Czynność powtarzamy tak długo, aż podczas sprawdzania całego ciagu, nie zajdzie ani jedna zamiana elementów. Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 30 / 35
Sortowanie babelkowe Require: tablica A o rozmiarze n {A=[0,...,n-1]} 1: for i = 0 to n 1 do 2: for j = n downto i + 1 do 3: if A[j 1] > A[j] then 4: Zamiana(A, j 1, 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 1 31 / 35
Sortowanie babelkowe - przykład 44 Klucze i = 1 06 55 44 12 55 42 12 94 42 18 94 06 18 67 67 i = 2 K r o k i a l g o r y t m u i = 3 06 06 12 12 44 18 55 44 18 55 42 42 94 67 67 94 i = 4 06 12 18 42 44 55 67 94 i = 5 06 12 18 42 44 55 67 94 i = 6 06 12 18 42 44 55 67 94 i = 7 06 12 18 42 44 55 67 94 Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 32 / 35
Sortowanie przez wstawianie - Koszt algorytmu Złożoność pesymistyczna: Operacja dominujaca: porównywanie elementów. Wejście: ciag uporzadkowany w odwrotnej kolejności. Koszt: T(n) = 1+2+3+...+n 1 = n(n 1)/2 = O(n 2 ) Złożoność optymistyczna: Operacja dominujaca: porównywanie elementów. Wejście: wszystkie permutacje ciagu wejściowego równie prawdopodobne. Koszt: O(n 2 ). Złożoność pamięciowa: O(1). Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 33 / 35
Sortowanie babelkowe - implementacja w C/C++ void bubblesort ( i n t A [ ], i n t n ) { for ( i n t i =0; i <n ; i ++) for ( i n t j =n 1; j > i ; j ) i f (A [ j ] < A [ j 1]) { / / zamiana A [ j 1] z A[ j ] i n t temp= A [ j 1]; A [ j 1] = A [ j ] ; A [ j ]= temp ; } } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 34 / 35
Sortowanie babelkowe - implementacja w C/C++ Zmodyfikowany algorytm sortowania babelkowego, którego wykonywanie kończy się z chwila stwierdzenia, że dana tablica a jest już posortowana. #include < s tdbool. h> void bubblesort ( i n t [ ] a, i n t n ) { bool done ; do { done = true ; for ( i n t j = 0; j < n ; j ++) { i f ( a [ j +1] < a [ j ] ) { swap ( a, j, j + 1 ) ; done = false ; } } } while (! done ) ; } Bożena Woźna-Szcześniak (AJD) Algorytmy i Struktury Danych. Wykład 1 35 / 35