Wstęp do programowania 1 Podstawowe algorytmy i ich implementacje w C Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 9
Element minimalny i maksymalny zbioru Element minimalny i maksymalny zbioru Definicja problemu: Dane: n - liczba elementów zbioru a1, a 2, a 3,...,a n - ciag elementów Szukane: Elementy największy i najmniejszy zbioru.
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;
Element minimalny i maksymalny zbioru Element minimalny zbioru - implementacja 1 i n t min ( i n t [ ] a, i n t n ) 2 { 3 i n t c urrentmin = 0; 4 for ( i n t i = 1; i < n ; i ++) 5 i f ( a [ c urrentmin ] < a [ i ] ) c urrentmin = i ; 6 return c urrentmin ; 7 }
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;
Element minimalny i maksymalny zbioru Element maksymalny zbioru - implementacja 1 i n t max( i n t [ ] a, i n t n ) 2 { 3 i n t currentmax = 0; 4 for ( i n t i = 1; i < n ; i ++) 5 i f ( a [ currentmax ] < a [ i ] ) currentmax = i ; 6 return currentmax ; 7 }
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 informację o tym, że jest on uporzadkowany.
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 większy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej części. Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej części.
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 większy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej części. Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej części.
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 większy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej części. Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej części.
Wyszukiwanie binarne Wyszukiwanie binarne - przykład Znaleźć liczbę 9 w ciagu: 3, 5, 7, 8, 9, 12, 15.
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; while ( l e f t <= r i g h t ) { i n t c u r r = ( l e f t + r i g h t ) / 2; i f ( key == a [ c u r r ] ) { r e t u r n c u r r ; } else i f ( key < a [ c u r r ] ) { r i g h t = c u r r 1; } else { l e f t = c u r r + 1; } } r e t u r n ( 1); }
Liczby pierwsze Liczby pierwsze Liczby pierwsze już od wieków fascynowały i zastanawiały uczonych. W matematyce pojęcie 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 się bez reszty tylko przez 1 i przez sama siebie, np. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 itd.
Liczby pierwsze Sita Eratostenesa Sito Eratostenesa to algorytm wyznaczania liczb pierwszych z zadanego przedziału [2, n]. Idea: Ze zbioru liczb naturalnych większych od jedności, tj. {2, 3, 4,...}, wybieramy najmniejsza, czyli 2, i wykreślamy wszystkie jej wielokrotności większe od niej samej, tj. wszystkie liczby parzyste większe od 2. Z pozostałych liczb wybieramy najmniejsza niewykreślona liczbę, tj. 3, i usuwamy wszystkie jej wielokrotności większe od niej samej: {6, 9, 12,...}; nie przejmujemy się tym, że niektóre liczby (np. 6) będa skreślane więcej niż raz. Według tej samej procedury postępujemy 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.
Liczby pierwsze Sita Eratostenesa - implementacja 1 #include < s t d l i b. h> 2 #include < s t d i o. h> 3 # include <stdbool. h> 4 i n t main ( void ) 5 { 6 p r i n t f ( " Podaj zakres : \ n " ) ; 7 long long n ; 8 scanf ( "%l l d ",&n ) ; 9 bool tab= c a l l o c ( n+1, sizeof ( bool ) ) ; 10 11 for ( i n t q=0;q<=n;++q ) tab [ q]= true ; 12 p r i n t f ( " L. pierwsze [2..% l l d ] wyznaczone alg. Eratostenesa : \ n ", n ) ; 13 for ( i n t q=2;q<=n;++q ) 14 i f ( tab [ q ] ) { 15 p r i n t f ( "%d \ t ", q ) ; 16 for ( i n t q2=q 2; q2<=n ; q2+=q ) tab [ q2 ]= false ; 17 } 18 p r i n t f ( " \ n " ) ; 19 f r e e ( tab ) ; 20 return 0; 21 }
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 będzie 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ść).
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 będzie 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ść).
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;
Liczby pierwsze Algorym wyznaczania l.pierwszych - implementacja 1 #include < s t d i o. h> 2 # include <stdbool. h> 3 # include <math. h> 4 bool d z i e l n i k ( long long, long long ) ; 5 bool pierwsza ( long long n ) ; 6 i n t main ( void ) { 7 long long n ; p r i n t f ( " Podaj l i c z b e : \ n " ) ; scanf ( "%l l d ",&n ) ; 8 bool odp = pierwsza ( n ) ; 9 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 ) ; 10 else p r i n t f ( "%l l d nie j e s t l i c z b a pierwsza. \ n ", n ) ; 11 return 0; 12 } 13 bool pierwsza ( long long n ) { 14 for ( long long i =2; i < s q r t ( n ) + 1; i ++) 15 i f ( d z i e l n i k ( i, n ) ) return false ; 16 return true ; 17 } 18 bool d z i e l n i k ( long long i, long long n ) { 19 i f ( n%i == 0) return true ; 20 else return false ; 21 }
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.
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.
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.
Popularne algorytmy sortowania przez porównywanie elementów: przez proste wybieranie (ang. selection sort) przez wstawianie (ang. insertion sort) babelkowe (ang. bubblesort) Inne - będa omawiane na przedmiocie ASD przez scalanie (ang. merge sort) sortowanie szybkie (ang. quicksort) przez zliczanie (ang. counting sort) pozycyjne (ang. radix sort) sortowanie przez kopcowanie (ang. heapsort)
Popularne algorytmy sortowania przez porównywanie elementów: przez proste wybieranie (ang. selection sort) przez wstawianie (ang. insertion sort) babelkowe (ang. bubblesort) Inne - będa omawiane na przedmiocie ASD przez scalanie (ang. merge sort) sortowanie szybkie (ang. quicksort) przez zliczanie (ang. counting sort) pozycyjne (ang. radix sort) sortowanie przez kopcowanie (ang. heapsort)
przez proste wybieranie przez proste wybieranie Idea 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). odbywa się w n-1 przebiegach. W i-tym przebiegu szukamy i-tego najmniejszego (największego) elementu.
przez proste wybieranie 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 ).
przez proste wybieranie przez proste wybieranie - Przykład nr iteracji - i Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 - 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 - na właściwej pozycji
przez proste wybieranie 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
przez proste wybieranie przez proste wybieranie - implementacja 1 void s e l e c t i o n S o r t ( i n t a [ ], i n t s ize ) 2 { 3 i n t i, j, min, temp ; 4 for ( i = 0; i < size 1; i ++) 5 { 6 min = i ; 7 for ( j = i +1; j < s ize ; j ++) 8 { 9 i f ( a [ j ] < a [ min ] ) min = j ; 10 } 11 temp = a [ i ] ; 12 a [ i ] = a [ min ] ; 13 a [ min ] = temp ; 14 } 15 }
przez wstawianie przez wstawianie Idea 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.
przez wstawianie 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
przez wstawianie 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 ).
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie 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
przez wstawianie przez wstawianie - implementacja 1 void i n s e r t ( i n t [ ] a, i n t n, i n t x ) 2 { 3 / / i n s e r t x i n t o a [ 0.. i 1] 4 i n t j ; 5 for ( j = i 1; j >= 0 && x < a [ j ] ; j ) 6 a [ j + 1] = a [ j ] ; 7 a [ j + 1] = x ; 8 }
przez wstawianie przez wstawianie - implementacja 1 void i n s e r t S o r t ( i n t [ ] a, i n t n ) 2 { 3 for ( i n t i = 1; i < n ; i ++) 4 { 5 / / i n s e r t a [ i ] i n t o a [ 0 : i 1] 6 i n s e r t ( a, i, a [ i ] ) ; 7 } 8 }
babelkowe babelkowe W sortowaniu babelkowym liczby zachowuja się jak babelki, po kolei, jedna po drugiej ida do góry (lub w prawo). 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.
babelkowe 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 ).
babelkowe 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
babelkowe babelkowe - implementacja 1 void bubblesort ( i n t A [ ], i n t n ) 2 { 3 for ( i n t i =0; i <n ; i ++) 4 for ( i n t j =n 1; j > i ; j ) 5 i f (A [ j ] < A [ j 1]) { 6 / / zamiana A [ j 1] z A [ j ] 7 i n t temp= A [ j 1]; 8 A [ j 1] = A [ j ] ; 9 A [ j ]= temp ; 10 } 11 }
babelkowe babelkowe - implementacja Zmodyfikowany algorytm sortowania babelkowego, którego wykonywanie kończy się z chwila stwierdzenia, że dana tablica a jest już posortowana. 1 void bubblesort ( i n t [ ] a, i n t n ) { 2 bool done ; 3 do { 4 done = t rue ; 5 for ( i n t j = 0; j < n ; j ++) 6 i f ( a [ j +1] < a [ j ] ) { 7 swap ( a, j, j + 1 ) ; 8 done = false ; 9 } 10 } while (! done ) ; 11 }