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 ) ;
}