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−11 złożoność O n 4 3 a n =4 ∗a n−11 złożoność O n a n =2 ∗a n−1 złożoność O n∗ln n2 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−11 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−11 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 n2 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