Wstep do programowania 1 - Podstawowe algorytmy i ich
Transkrypt
Wstep do programowania 1 - Podstawowe algorytmy i ich
Wstep ˛ do programowania 1 Wstep ˛ do programowania 1 Podstawowe algorytmy i ich implementacje w C Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 9 Wstep ˛ do programowania 1 Element minimalny i maksymalny zbioru Element minimalny i maksymalny zbioru Definicja problemu: ◮ Dane: ◮ ◮ ◮ n - liczba elementów zbioru a1 , a2 , a3 , . . . , an - ciag ˛ elementów Szukane: Elementy najwiekszy ˛ i najmniejszy zbioru. Wstep ˛ do programowania 1 Element minimalny i maksymalny zbioru Element minimalny zbioru Require: tablica A o rozmiarze n {A=[0,. . . ,n-1]} Algorytm: MIN 1: min = 0; 2: for all i = 1 to n do 3: if A[i] < A[min] then 4: min = i; 5: end if 6: i = i + 1; 7: end for 8: return min; Wstep ˛ do programowania 1 Element minimalny i maksymalny zbioru Element minimalny zbioru - implementacja 1 2 3 4 5 6 7 i n t min ( i n t [ ] a , i n t n ) { int currentMin = 0; f o r ( i n t i = 1 ; i < n ; i ++) i f ( a [ currentMin ] < a [ i ] ) currentMin = i ; ret urn c u r r e n t M i n ; } Wstep ˛ do programowania 1 Element minimalny i maksymalny zbioru Element maksymalny zbioru Require: tablica A o rozmiarze n {A=[0,. . . ,n-1]} Algorytm: MAX 1: max = 0; 2: for all i = 1 to n do 3: if A[i] > A[max] then 4: max = i; 5: end if 6: i = i + 1; 7: end for 8: return max; Wstep ˛ do programowania 1 Element minimalny i maksymalny zbioru Element maksymalny zbioru - implementacja 1 2 3 4 5 6 7 i n t max ( i n t [ ] a , i n t n ) { i n t c ur r entMax = 0 ; f o r ( i n t i = 1 ; i < n ; i ++) i f ( a [ c ur r entMax ] < a [ i ] ) c ur r entMax = i ; ret urn c ur r entMax ; } Wstep ˛ do programowania 1 Wyszukiwanie binarne Wyszukiwanie binarne Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania binarnego wynika z tego, że zamiast przegladać ˛ wszystkie elementy posortowanego zbioru po kolei, wykorzystujemy informacje˛ o tym, że jest on uporzadkowany. ˛ Wstep ˛ do programowania 1 Wyszukiwanie binarne Wyszukiwanie binarne Algorytm: Dana jest tablica A oraz poszukiwany element key. ◮ Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. ◮ Jeśli środkowy element jest wiekszy ˛ niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej cz˛eści. ◮ Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej cz˛eści. Wstep ˛ do programowania 1 Wyszukiwanie binarne Wyszukiwanie binarne Algorytm: Dana jest tablica A oraz poszukiwany element key. ◮ Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. ◮ Jeśli środkowy element jest wiekszy ˛ niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej cz˛eści. ◮ Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej cz˛eści. Wstep ˛ do programowania 1 Wyszukiwanie binarne Wyszukiwanie binarne Algorytm: Dana jest tablica A oraz poszukiwany element key. ◮ Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. ◮ Jeśli środkowy element jest wiekszy ˛ niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej cz˛eści. ◮ Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej cz˛eści. Wstep ˛ do programowania 1 Wyszukiwanie binarne Wyszukiwanie binarne - przykład Znaleźć liczbe˛ 9 w ciagu: ˛ 3, 5, 7, 8, 9, 12, 15 . ◮ ◮ ◮ ◮ ◮ ◮ Wstep ˛ do programowania 1 Wyszukiwanie binarne Wyszukiwanie binarne - implementacja i n t binSearch ( i n t a [ ] , i n t n , i n t key ) { i n t l e f t = 0 , r i g h t = n − 1; w h i l e ( l e f t <= r i g h t ) { i n t curr = ( l e f t + r i g h t ) / 2; i f ( key == a [ c u r r ] ) { return curr ; } e l s e i f ( key < a [ c u r r ] ) { r i g h t = curr − 1; } else { l e f t = curr + 1; } } r e t u r n ( −1); } Wstep ˛ do programowania 1 Liczby pierwsze Liczby pierwsze ◮ Liczby pierwsze już od wieków fascynowały i zastanawiały uczonych. W matematyce pojecie ˛ pierwszości liczb, to fundamentalne zagadnienie dotyczace ˛ liczb naturalnych. Jest ich nieskończenie wiele, co udowodnił już Euklides. ◮ Liczba˛ pierwsza˛ jest liczba naturalna, która dzieli sie˛ bez reszty tylko przez 1 i przez sama˛ siebie, np. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 itd. Wstep ˛ do programowania 1 Liczby pierwsze Sita Eratostenesa Sito Eratostenesa to algorytm wyznaczania liczb pierwszych z zadanego przedziału [2, n]. Idea: ◮ Ze zbioru liczb naturalnych wiekszych ˛ od jedności, tj. {2, 3, 4, . . .}, wybieramy najmniejsza, ˛ czyli 2, i wykreślamy wszystkie jej wielokrotności wieksze ˛ od niej samej, tj. wszystkie liczby parzyste wieksze ˛ od 2. ◮ Z pozostałych liczb wybieramy najmniejsza˛ niewykreślona˛ liczbe, ˛ tj. 3, i usuwamy wszystkie jej wielokrotności wieksze ˛ od niej samej: {6, 9, 12, . . .}; nie przejmujemy sie˛ tym, że niektóre liczby (np. 6) bed ˛ a˛ skreślane wiecej ˛ niż raz. ◮ Według tej samej procedury postepujemy ˛ dla liczby 5. Potem dla liczby 7, 11, 13, itd., aż do sprawdzenia wszystkich niewykreślonych wcześniej liczb. ◮ Dla danej liczby n wszystkie niewykreślone liczby mniejsze od n sa˛ liczbami pierwszymi. Wstep ˛ do programowania 1 Liczby pierwsze Sita Eratostenesa - implementacja 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # include < s t d l i b . h> # include < s t d i o . h> # include < s t d b o o l . h> i n t main ( void ) { p r i n t f ( " Podaj zakres : \ n " ) ; long long n ; s c a n f ( "%l l d " ,&n ) ; bool ∗ ta b = c a l l o c ( n+1 , s iz e o f ( bool ) ) ; f o r ( i n t q =0; q<=n ;++ q ) ta b [ q ]= t r u e ; p r i n t f ( " L . pierwsze [ 2 . . % l l d ] wyznaczone a l g . E r a to s te n e s a : \ n " , n ) ; f o r ( i n t q =2; q<=n ;++ q ) i f ( ta b [ q ] ) { p r i n t f ( "%d \ t " , q ) ; f o r ( i n t q2=q ∗ 2 ; q2<=n ; q2+=q ) ta b [ q2 ]= f a l s e ; } pri ntf ( " \n" ); f r e e ( ta b ) ; return 0; } Wstep ˛ do programowania 1 Liczby pierwsze Algorym wyznaczania liczb pierwszych Twierdzenie 1 Liczba złożona n posiada dzielnik, który jest mniejszy od pierwiastka z tej liczby, tj. sqrt(n). Dowód - idea: Niech n bedzie ˛ liczba˛ złożona. ˛ Wtedy n = a · b oraz 0 < a ≤ b < n. Zatem musi być a ≤ sqrt(n), gdyż inaczej otrzymalibyśmy a · b > n (sprzeczność). Wstep ˛ do programowania 1 Liczby pierwsze Algorym wyznaczania liczb pierwszych Twierdzenie 1 Liczba złożona n posiada dzielnik, który jest mniejszy od pierwiastka z tej liczby, tj. sqrt(n). Dowód - idea: Niech n bedzie ˛ liczba˛ złożona. ˛ Wtedy n = a · b oraz 0 < a ≤ b < n. Zatem musi być a ≤ sqrt(n), gdyż inaczej otrzymalibyśmy a · b > n (sprzeczność). Wstep ˛ do programowania 1 Liczby pierwsze Algorym wyznaczania liczb pierwszych Require: tablica A o rozmiarze n+1 {A=[0,. . . ,n+1]} Algorytm: Czy n jest liczba˛ pierwsza˛ 1: i = 2 2: while i < sqrt(n) + 1 do 3: if i jest dzielnikiem n then 4: return n jest liczba˛ złożona; ˛ 5: end if 6: i = i + 1; 7: end while 8: return n jest liczba˛ pierwsza; ˛ Wstep ˛ do programowania 1 Liczby pierwsze Algorym wyznaczania l.pierwszych - implementacja 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # include < s t d i o . h> # include < s t d b o o l . h> # include <math . h> bool d z i e l n i k ( long long , long long ) ; bool pierwsza ( long long n ) ; i n t main ( void ) { long long n ; p r i n t f ( " Podaj l i c z b e : \ n " ) ; s c a n f ( "%l l d " ,&n ) ; bool odp = pierwsza ( n ) ; i f ( odp ) p r i n t f ( "%l l d j e s t l i c z b a pierwsza . \ n " , n ) ; else p r i n t f ( "%l l d n i e j e s t l i c z b a pierwsza . \ n " , n ) ; return 0; } bool pierwsza ( long long n ) { f o r ( long long i =2; i < s q r t ( n ) + 1 ; i ++) i f ( d z i e l n i k ( i , n ) ) return false ; return true ; } bool d z i e l n i k ( long long i , long long n ) { i f ( n%i == 0 ) r e t u r n t r u e ; else r e t u r n f a l s e ; } Wstep ˛ do programowania 1 Sortowanie Problem Sortowania Definicja problemu Niech (U, ≤) bedzie ˛ zbiorem liniowo uporzadkowanym ˛ z relacja˛ porzadkuj ˛ ac ˛ a˛ ≤ i niech (a1 , a2 , . . . , an ) bedzie ˛ ciagiem ˛ n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutacje˛ (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ć sie˛ 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. Wstep ˛ do programowania 1 Sortowanie Problem Sortowania Definicja problemu Niech (U, ≤) bedzie ˛ zbiorem liniowo uporzadkowanym ˛ z relacja˛ porzadkuj ˛ ac ˛ a˛ ≤ i niech (a1 , a2 , . . . , an ) bedzie ˛ ciagiem ˛ n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutacje˛ (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ć sie˛ 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. Wstep ˛ do programowania 1 Sortowanie Problem Sortowania Definicja problemu Niech (U, ≤) bedzie ˛ zbiorem liniowo uporzadkowanym ˛ z relacja˛ porzadkuj ˛ ac ˛ a˛ ≤ i niech (a1 , a2 , . . . , an ) bedzie ˛ ciagiem ˛ n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutacje˛ (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ć sie˛ 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. Wstep ˛ do programowania 1 Sortowanie 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) Inne - bed ˛ a˛ omawiane na przedmiocie ASD ◮ Sortowanie przez scalanie (ang. merge sort) ◮ sortowanie szybkie (ang. quicksort) ◮ Sortowanie przez zliczanie (ang. counting sort) ◮ Sortowanie pozycyjne (ang. radix sort) ◮ sortowanie przez kopcowanie (ang. heapsort) Wstep ˛ do programowania 1 Sortowanie 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) Inne - bed ˛ a˛ omawiane na przedmiocie ASD ◮ Sortowanie przez scalanie (ang. merge sort) ◮ sortowanie szybkie (ang. quicksort) ◮ Sortowanie przez zliczanie (ang. counting sort) ◮ Sortowanie pozycyjne (ang. radix sort) ◮ sortowanie przez kopcowanie (ang. heapsort) Wstep ˛ do programowania 1 Sortowanie Sortowanie przez proste wybieranie 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 odpowiednia˛ pozycje˛ do ciagu ˛ wynikowego (przez zamiane˛ elementów miejscami). Sortowanie odbywa sie˛ w n-1 przebiegach. W i-tym przebiegu szukamy i-tego najmniejszego (najwiekszego) ˛ elementu. Wstep ˛ do programowania 1 Sortowanie Sortowanie przez proste wybieranie 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 wzgledu ˛ na dwie zagnieżdżone petle, ˛ z których każda wykonuje sie˛ dokładnie n razy, algorytm wymaga n ∗ n porównań, aby posortować n elementowy ciag, ˛ czyli jest w klasie O(n2 ). Wstep ˛ do programowania 1 Sortowanie Sortowanie przez proste wybieranie Sortowanie przez proste wybieranie - Przykład nr iteracji - i 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [0,1,6,8,4,3,2,9] [0,1,6,8,4,3,2,9] [0,1,2,8,4,3,6,9] [0,1,2,3,4,8,6,9] [0,1,2,3,4,8,6,9] [0,1,2,3,4,6,8,9] [0,1,2,3,4,6,8,9] Minimum 0 1 - na właściwej pozycji 2 3 4 6 8 9 - na właściwej pozycji Wstep ˛ do programowania 1 Sortowanie Sortowanie przez proste wybieranie Sortowanie przez wybieranie – Sortowanie przez proste wybieranie - Przykład K r o k i a l g o r y t m u 44 55 12 42 94 18 06 67 i = 2 06 55 12 42 94 18 44 67 i = 3 06 12 55 42 94 18 44 67 i = 4 06 12 18 42 94 55 44 67 i = 5 06 12 18 42 44 55 94 67 i = 6 06 12 18 42 44 55 67 94 Klucze !"#$%&!'( Wstep ˛ do programowania 1 Sortowanie Sortowanie przez proste wybieranie Sortowanie przez proste wybieranie - implementacja 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 void s e l e c t i o n S o r t ( i n t a [ ] , i n t s i z e ) { i n t i , j , min , temp ; f o r ( i = 0 ; i < s i z e −1; i ++) { min = i ; f o r ( j = i +1; j < s i z e ; j ++) { i f ( a [ j ] < a [ min ] ) min = j ; } temp = a [ i ] ; a [ i ] = a [ min ] ; a [ min ] = temp ; } } Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie Idea Sortowanie przez wstawianie odbywa sie˛ w n − 1 przebiegach. W i-tym przebiegu elementy na pozycjach 1, . . . , (i − 1) sa˛ już uporzadkowane, ˛ a wstawiany i-ty element przepycha sie˛ do przodu na właściwe miejsce, tak by stworzył wraz z innymi ciag ˛ uporzadkowany ˛ długości i. Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie 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 done Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie 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 wzgledu ˛ na dwie zagnieżdżone petle, ˛ z których każda wykonuje sie˛ dokładnie n razy, algorytm wymaga n ∗ n porównań, aby posortować n elementowy ciag, ˛ czyli jest w klasie O(n2 ). Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) 0 1 2 3 4 5 6 7 Tablica [9,1,6,8,4,3,2,0] [1,9,6,8,4,3,2,0] [1,6,9,8,4,3,2,0] [1,6,8,9,4,3,2,0] [1,6,8,4,9,3,2,0] [1,6,4,8,9,3,2,0] [1,4,6,8,9,3,2,0] [1,4,6,8,3,9,2,0] [1,4,6,3,8,9,2,0] [1,4,3,6,8,9,2,0] [1,3,4,6,8,9,2,0] [1,2,3,4,6,8,9,0] [1,2,3,4,6,8,9,0] Rozważany element 9 1 6 8 4 4 4 3 3 3 3 2 0 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - przyk Sortowanie przez wstawianie - przykład 44 55 12 42 94 18 06 67 i = 2 44 55 12 42 94 18 06 67 i = 3 12 44 55 42 94 18 06 67 i = 4 12 42 44 55 94 18 06 67 i = 5 12 42 44 55 94 18 06 67 12 18 42 44 55 94 06 67 i = 7 06 12 18 42 44 55 94 67 i = 8 06 12 18 42 44 55 67 94 Klucze K r o k i a l g o r y t m u !"#$%&!'( i = 6 Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - implementacja 1 2 3 4 5 6 7 8 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] int j ; f o r ( j = i − 1 ; j >= 0 && x < a [ j ] ; j −−) a [ j + 1] = a [ j ] ; a [ j + 1] = x ; } Wstep ˛ do programowania 1 Sortowanie Sortowanie przez wstawianie Sortowanie przez wstawianie - implementacja 1 2 3 4 5 6 7 8 void i n s e r t S o r t ( i n t { for ( int i = 1; i { / / insert a[ i ] insert (a, i , a[ } } [ ] a , int n) < n ; i ++) i n t o a [ 0 : i −1] i ]); Wstep ˛ do programowania 1 Sortowanie Sortowanie babelkowe ˛ Sortowanie babelkowe ˛ W sortowaniu babelkowym ˛ liczby zachowuja˛ sie˛ 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/najwiekszy ˛ element. Idea ◮ Sprawdzamy cały ciag ˛ od końca. Jeżeli trafimy na pare˛ elementów, w której wiekszy ˛ poprzedza mniejszy, to zamieniamy je miejscami. ◮ Czynność powtarzamy tak długo, aż podczas sprawdzania całego ciagu, ˛ nie zajdzie ani jedna zamiana elementów. Wstep ˛ do programowania 1 Sortowanie Sortowanie babelkowe ˛ 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 wzgledu ˛ na dwie zagnieżdżone petle, ˛ z których każda wykonuje sie˛ dokładnie n razy, algorytm wymaga n ∗ n porównań, aby posortować n elementowy ciag, ˛ czyli jest w klasie O(n2 ). Wstep ˛ do programowania 1 Sortowanie Sortowanie babelkowe ˛ - Sortowanie babelkowe ˛ - przykład Kroki algorytmu Klucze i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 44 06 06 06 06 06 06 06 55 44 12 12 12 12 12 12 12 55 44 18 18 18 18 18 42 12 55 44 42 42 42 42 94 42 18 55 44 44 44 44 18 94 42 42 55 55 55 55 06 18 94 67 67 67 67 67 67 67 67 94 94 94 94 94 !"#$%&!'( Wstep ˛ do programowania 1 Sortowanie Sortowanie babelkowe ˛ Sortowanie babelkowe ˛ - implementacja 1 2 3 4 5 6 7 8 9 10 11 void b u b b l e S o r t ( i n t A [ ] , i n t n ) { f o r ( i n t i =0; i <n ; i ++) f o r ( 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 ; } } Wstep ˛ do programowania 1 Sortowanie Sortowanie babelkowe ˛ Sortowanie babelkowe ˛ - implementacja Zmodyfikowany algorytm sortowania babelkowego, ˛ którego wykonywanie kończy sie˛ z chwila˛ stwierdzenia, że dana tablica a jest już posortowana. 1 2 3 4 5 6 7 8 9 10 11 void b u b b l e S o r t ( i n t [ ] a , i n t n ) { bool done ; do { done = t rue ; f o r ( i n t j = 0 ; j < n ; j ++) i f ( a [ j +1] < a [ j ] ) { swap ( a , j , j + 1 ) ; done = f a l s e ; } } while ( ! done ) ; }