Raport z projektu

Transkrypt

Raport z projektu
Raport z projektu
Przedmiot: Algorytmy i struktury danych 1
Projekt: Sortowanie Shella
Autor: Wojciech Topolski
1. Zadanie
Zbadać różne metody sortowania bazując na sortowaniu Shella za pomocą różnych ciągów.
Sprawdzić czy złożoność obliczeniowa względem danych wejściowych zgadza się zakładaną. Ciągi
do przetestowania:
1.
2.
3.
3
2
a n =3 ∗a n−11 złożoność O n 
4
3
a n =4 ∗a n−11 złożoność O n 
a n =2 ∗a n−1 złożoność O n∗ln n2 
2. Charakterystyka sortowania Shella
W roku 1959 D. L. Shell zaproponował ulepszenie metody sortowania przez wstawianie.
Oryginalna metoda dokonuje porównywania jedynie sąsiednich elementów, dlatego przesunięcie
elementu na większą odległość wymaga kilku kroków. W ulepszonej wersji porównuje się elementy
leżące daleko od siebie. Dokładniej – w ciągu elementów wejściowych wyodrębnia się podciągi
elementów, odległych od siebie o ustalony dystans h, a więc elementami i-tego podciągu są
elementy X[i+h], X[i+2*h], X[i+3*h] dla i = 0,..., h – 1. Pojedynczy
przebieg sortowania polega na posortowaniu wszystkich tych podciągów (metodą sortowania przez
wstawianie). Wartość h, ustalona dla danego przebiegu, jest coraz mniejsza w kolejnych
przebiegach, by wreszcie w ostatnim przebiegu przyjąć wartość 1. Ostatni przebieg jest więc
zwykłym sortowaniem przez wstawianie, zaś zadaniem poprzedzających go przebiegów jest
zwiększenie stopnia ich uporządkowania. Faktyczna efektywność metody zależy w pierwszym
rzędzie od właściwego współczynników h.
3
Przkładowa funkcja dla a =3 ∗a 1 złożoność O n 2 
n
n−1
// Sortowanie Shella dla h_(n+1) = 3 * h_(n) + 1
void sort_shell_1(int *tablica, int ilosc)
{
int h;
int i;
int temp;
for (h = 1; h <= ilosc / 9; h = 3 * h + 1); // Wyznaczam maksymalne h
for ( ; h > 0; h /= 3) // Przechodzie po ciagu uzywajac coraz nizszego h
{
for (i = h; i < ilosc; i++)
{
int j;
temp = tablica[i];
for (j = i - h; j >= 0; j -= h)
{
if (temp <= tablica[j])
tablica[j + h] = tablica[j];
else
break;
}
tablica[j + h] = temp;
}
}
}
3
3. Badanie sortowania Shella dla ciągu: a n =3 ∗a n−11 złożoność O n 2 
Poniżej na wykresie podaje zależności czasowe dla sortowania Shella z ciągiem (powyżej),
oraz wykres funkcji podanej w złożoności obliczeniowej.
Ilość
1,00E+00
5,00E+00
1,00E+01
5,00E+01
1,00E+02
5,00E+02
1,00E+03
Sortowanie Funkcja O n
138
138
484
1543
1715
4364
14100
48790
34000
138000
564829
1542887
3907578
4363943
3
2

a_(n) = 3 * a_(n-1) + 1
4500000
4000000
Ilośc czasu
3500000
3000000
2500000
2000000
1500000
1000000
500000
0
1,00E+00
Sortowanie
Funkcja
5,00E+00
1,00E+01
5,00E+01
1,00E+02
5,00E+02
1,00E+03
Ilośc danych
4
4. Badanie sortowania Shella dla ciągu: a n =4 ∗a n−11 złożoność O n 3 
Poniżej na wykresie podaje zależności czasowe dla sortowania Shella z ciągiem (powyżej),
oraz wykres funkcji podanej w złożoności obliczeniowej.
Ilość
1,00E+00
5,00E+00
1,00E+01
5,00E+01
1,00E+02
5,00E+02
1,00E+03
Sortowanie Funkcja O n
136
75
464
641
1291
1616
12952
13815
34380
34812
255697
297638
567554
750000
4
3

Ilośc czasu
a_(n) = 4 * a_(n-1) + 1
750000
700000
650000
600000
550000
500000
450000
400000
350000
300000
250000
200000
150000
100000
50000
0
1,00E+00
5,00E+00
Sortowanie
Funkcja
1,00E+01
5,00E+01
1,00E+02
5,00E+02
1,00E+03
Ilośc danych
5. Badanie sortowania Shella dla ciągu: a n =2 ∗a n−1 złożoność O n∗ln n2 
Poniżej na wykresie podaje zależności czasowe dla sortowania Shella z ciągiem (powyżej),
oraz wykres funkcji podanej w złożoności obliczeniowej.
Ilość
1,00E+00
5,00E+00
1,00E+01
5,00E+01
1,00E+02
5,00E+02
1,00E+03
Sortowanie Funkcja
137
704
570
2010
2333
19099
33669
48490
93313
368553
849670
918862
2099552
a_(n) = 2 * a_(n-1)
2250000
2000000
Ilośc czasu
1750000
1500000
1250000
1000000
750000
500000
250000
0
1,00E+00
Sortowanie
Funkcja
5,00E+00
1,00E+01
5,00E+01
1,00E+02
Ilośc danych
5,00E+02
1,00E+03

Podobne dokumenty