Podstawowe algorytmy i ich implementacje w C. Wykład 9

Podobne dokumenty
Programowanie Proceduralne

Algorytmy i Struktury Danych.

Podstawy Informatyki

Algorytmy i Struktury Danych.

Laboratorium nr 7 Sortowanie

Analiza algorytmów zadania podstawowe

Algorytmy i Struktury Danych.

Algorytm selekcji Hoare a. Łukasz Miemus

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Informatyka A. Algorytmy

Algorytmy i Struktury Danych.

Wykład 4. Sortowanie

Algorytmy i Struktury Danych

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Programowanie w VB Proste algorytmy sortowania

Strategia "dziel i zwyciężaj"

Algorytmy i Struktury Danych.

Sortowanie - wybrane algorytmy

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Sortowanie bąbelkowe

Analiza algorytmów zadania podstawowe

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Wybrane algorytmy tablicowe

Wstęp do programowania

Algorytmy i struktury danych

Algorytmy i Struktury Danych, 2. ćwiczenia

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Wstęp do programowania

Sortowanie w czasie liniowym

Wrocław, Wstęp do informatyki i programowania: liczby pierwsze. Wydział Matematyki Politechniki Wrocławskiej.

Metodyki i Techniki Programowania 2

Algorytmy sortujące i wyszukujące

ALGORYTMY I STRUKTURY DANYCH

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

PODSTAWY INFORMATYKI wykład 10.

Struktury Danych i Złożoność Obliczeniowa

INFORMATYKA SORTOWANIE DANYCH.

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

Laboratoria nr 1. Sortowanie

Algorytmy sortujące. sortowanie kubełkowe, sortowanie grzebieniowe

Jeszcze o algorytmach

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2014/2015. Drzewa BST c.d., równoważenie drzew, kopce.

Sortowanie. Bartman Jacek Algorytmy i struktury

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Podstawy programowania. Przykłady algorytmów Cz. 2 Sortowanie

E S - uniwersum struktury stosu

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

Podstawy Programowania 1 Sortowanie tablic jednowymiarowych. Plan. Sortowanie. Sortowanie Rodzaje sortowania. Notatki. Notatki. Notatki.

Sortowanie przez scalanie

Podstawy Informatyki. Sprawność algorytmów

Poszukiwanie liniowe wśród liczb naturalnych

Wykład 2. Poprawność algorytmów

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wstęp do Informatyki

PODSTAWY INFORMATYKI wykład 5.

Wstęp do programowania

Problemy porządkowe zadania

Algorytmy i Struktury Danych.

EGZAMIN MATURALNY Z INFORMATYKI. 10 maja 2017 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I

Zaawansowane algorytmy i struktury danych

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

. Podstawy Programowania 1. Sortowanie tablic jednowymiarowych. Arkadiusz Chrobot. 16 listopada 2016

Algorytmy. 1. Sortowanie 2. Statki i okręty. programowanie cz.7. poniedziałek, 2 marca 2009

Algorytmy i Struktury Danych, 2. ćwiczenia

Źródła. N.Wirth Algorithms and Data Structures, 1985 D.E.Knuth The Art of Computer Programming. Vol. 3, 1973

Algorytmy i struktury danych. Wykład 4

Podstawy algorytmiki i programowania - wykład 3 Funkcje rekurencyjne Wyszukiwanie liniowe i binarne w tablicy

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

Wstęp do programowania

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Podstawy Programowania Podstawowa składnia języka C++

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima Uwagi przed sprawdzianem nr 1.

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Algorytm i złożoność obliczeniowa algorytmu

Sortowanie. LABORKA Piotr Ciskowski

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Algorytmy. Programowanie Proceduralne 1

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Algorytmy i struktury danych

Wstęp do programowania. Dariusz Wardecki, wyk. V

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Algorytmy sortujące 1

Temat: Liniowe uporzdkowane struktury danych: stos, kolejka. Specyfikacja, przykładowe implementacje i zastosowania. Struktura słownika.

Zaawansowane algorytmy i struktury danych

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI

Wstęp do programowania

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

Kontrola przebiegu programu

Wstęp do programowania

Transkrypt:

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 }