Академический Документы
Профессиональный Документы
Культура Документы
Klucze
początkowe 44 55 12 42 94 18 06 67
Klucze 44 55 12 42 94 18 06 67
początkowe
K
r i=2 44 55 12 42 94 18 06 67
o
k i=3 12 44 55 42 94 18 06 67
i
a
i=4 12 42 44 55 94 18 06 67
l
g i=5 12 42 44 55 94 18 06 67
o
r 12 18 42 44 55 94 06 67
i=6
y
t
m
i=7 06 12 18 42 44 55 94 67
u
i=8 06 12 18 42 44 55 67 94
Algorytmy i struktury danych 3
Idea algorytmu sortowania przez wstawianie
K Klucze 44 55 12 42 94 18 06 67
r początkowe
o
k
i=2 06 55 12 42 94 18 44 67
i
i=3 06 12 55 42 94 18 44 67
a
l
g i=4 06 12 18 42 94 55 44 67
o
r
y
i=5 06 12 18 42 44 55 94 67
t
m i=6 06 12 18 42 44 55 67 94
u
Kroki algorytmu
Klucze
i=2 i=3 i=4 i=5 i=6 i=7 i=8
początkowe
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
Algorytmy i struktury danych 10
Idea algorytmu sortowania przez zamianę
44 06 06 06 06
55 44 44 12 12
12 55 12 44 18
42 12 42 18 42
94 42 55 42 44
18 94 18 55 55
06 18 67 67 67
67 67 94 94 94
Algorytmy i struktury danych 13
Przykładowy algorytm sortowania mieszanego
void ShakeSort (int tab[ ], int n)
{
int left=0, right=n-1, k=n-1;
do
{
−−)
−−
for (int j= right; j>left; j−−
if (tab[j-1]>tab[j ])
{
zamiana (tab[j −1], tab[j ]);
k=j;
}
left=k+1;
for (j= left; j<right; j++)
if (tab[j-1]>tab[j ])
{
zamiana (tab[j −1], tab[j ]);
k=j;
}
right=k-1;
} while (left<right);
}
Algorytmy i struktury danych 14
ZłoŜoność obliczeniowa algorytmów sortowania
{ TOmax = ∑∑ 1 = i = 1 + 2 + ... + n − 1 =
∑
i =1 j =1 i =1
for ( int i=1, j; i<n; i++) n(n − 1)
{ = = 0,5 (n 2
- n) = O(n 2
)
2
int temp=tab[i];
for (j=i; j>0 && temp<tab[j-1]; j--)
tab[j]= tab[j-1];
n −1 i n −1
tab[j]=temp;
}
TRmax = (1 + 1 + 1) = 2(n − 1) + i =
∑ ∑ ∑
i =1 j =1 i =1
} = 2(n − 1) + 1 + 2 + ... + n − 1 =
n(n − 1)
= 2(n − 1) + = 0,5 (n2 + 3 n - 4) = O(n 2 )
2
Algorytmy i struktury danych 16
ZłoŜoność obliczeniowa algorytmów sortowania
{ n( n − 1 )
= = O( n 2 )
for (j=i+1, least=i; j<n; j++) 2
if (tab[j] < tab[least])
least=j;
// zamiana (tab[least], tab[i]);
int temp= tab[least];
tab[least] = tab[i];
TR min = TR max = 3 ( n − 1 ) = O( n )
tab[i ]=temp;
}
}
Algorytmy i struktury danych 18
ZłoŜoność obliczeniowa algorytmów sortowania, cd.
94
55 94
55 42 94 67
44 55 12 42 94 18 06 67
55
55 42 67
44 55 12 42 18 06 67
67
55 67
55 42 18 67
44 55 12 42 18 06 67
55
55 42 18
44 55 12 42 18 06
55
55 18
55 42 18 6
44 55 12 42 18 6
11 10 2 3
1 8
15 12 6 11 10 2 3 1 8
12 6
11 10 2 3
1 15
8 12 6 11 10 2 3 1 15
12
11 6
8 10 2 3
1 15
12 11 6 8 10 2 3 1 15
11 6
8 10 2 3
12 15
1 11 6 8 10 2 3 12 15
11
10 6
8 1 2 3
12 15
11 10 6 8 1 2 3 12 15
10 6
8 1 2 11
12 15
3 10 6 8 1 2 11 12 15
10
8 6
3 1 2 11
12 15
10 8 6 3 1 2 11 12 15
8 6
3 1 10 11
12 15
2 8 6 3 1 10 11 12 15
3 6
2 1 10 11
12 15
8 3 6 2 1 10 11 12 15
3 6
2 8 10 11
12 15
1 3 6 2 8 10 11 12 15
3 1
2 8 10 11
12 15
6 3 1 2 8 10 11 12 15
3 1
6 8 10 11
12 15
2 3 1 6 8 10 11 12 15
2 1
6 8 10 11
12 15
3 2 1 6 8 10 11 12 15
2 3
6 8 10 11
12 15
1 2 3 6 8 10 11 12 15
1 3
6 8 10 11
12 15
2 1 3 6 8 10 11 12 15
2 3
6 8 10 11
12 15
1 2 3 6 8 10 11 12 15
heapsort(data[ ] ,n )
1) przekształć tablicę w kopiec;
2) for (i=n-1; i>1; i--) {
zamień korzeń z elementem na pozycji i;
odtwórz własność kopca dla drzewa data[0], data[1], ..., data[i-1];
}
np. dla ht=3 tablica Tab = [ Tab [0], Tab [1], Tab [2], Tab [3],... ]
zostanie podzielona na 3 podtablice:
Tab1, Tab2 oraz Tab3 w następujący sposób:
Tab31[0]=Tab[0], Tab31[1]=Tab[3], ..., Tab31[i]=Tab[3*i], ...
Tab32[0]=Tab[1], Tab32[1]=Tab[4], ..., Tab32[i]=Tab[3*i+1], ...
Tab33[0]=Tab[2], Tab33[1]=Tab[5], ..., Tab33[i]=Tab[3*i+2], ...
wszystkie podtablice sortowane są niezaleŜnie;
następnie tworzone są nowe podtablice, przy czym ht-1< ht
Algorytmy i struktury danych 50
Sortowanie metodą malejących przyrostów (Shella)
Przykład
Tab=[ 5, 3, 6, 7, 2, 1, 9, 4, 8 ]
ht=3
Wówczas:
Tab1=[ 5, 7, 9 ]
Tab2=[ 3, 2, 4 ]
Tab3=[ 6, 1, 8 ]
Idea metody:
10 5 7 8 14 12 3 4 1
Rozdzielanie ze
względu na wybraną 5 7 8 3 4 1 10 14 12
medianę
Stosujemy 3 4 1 5 7 8 12 14
rekurencyjnie tę
samą zasadę do
obu części 1 3 4 7 8
1 3 4 5 7 8 10 12 14
Algorytm QuickSort
void QuickSort(int *Tab, int left, int right) {
if (left < right) {
int med=left;
for ( int i=left+1; i < right; i++ )
if ( Tab[i] < Tab[left] )
Zamiana( Tab[++med], Tab[i] );
Zamiana( Tab[left], Tab[med] );
QuickSort(Tab, left, med-1);
QuickSort(Tab, med+1, right);
}
}
29 40 2 1 6 18 20 32 23 34 39 41
29
2 1 6 18 20 23 40 32 34 39 41
2 40
1 32 34 39 41
6 18 20 23
1 2 6 18 20 23 29 32 34 39 40 41
Algorytmy i struktury danych 62
Sortowanie szybkie – przypadek pesymistyczny
Przypadek pesymistyczny zachodzi wówczas, gdy wektor jest
uporządkowany (np. rosnąco lub malejąco)
Pesymistyczna złoŜoność algorytmu QuickSort mierzona liczbą
porównań wartości wynosi O(n 2)
T(n) = O(n lg n)
Algorytmy i struktury danych 64
Sortowanie szybkie – przypadek średni
Idea metody:
16 5 12 4 10 6 1 13 15 7 1 14 9 3 8 11
16 5 12 4 10 6 1 13 15 7 1 14 9 3 8 11
16 5 12 4 10 6 1 13 15 7 1 14 9 3 8 11
16 5 12 4 10 6 1 13
5 16 4 12 6 10 1 13
4 5 12 16 1 6 10 13
1 4 5 6 10 12 13 16 1 3 7 8 9 11 14 15
1 3 4 5 6 7 8 9 10 11 12 13 14 15 16
ZłoŜoność sortowania
ZłoŜoność sortowania
http://www.cs.ubc.ca/spider/harrison/Java/sorting-demo.html
pokaz