Lista 2

by Jerry Sky



Opis

Cały kod źródłowy jest zawarty głównie w funkcji main.cpp, ex-1.cpp, ex-2.cpp oraz plikach w katalogu shared.

W celu kompilacji programu należy użyć make main.out. (Możliwe jest uprzednie posprzątanie make clean)
Żeby uruchomić program należy użyć ./main.out <params>, gdzie <params>:

Zadanie 1

Celem zadani jest zaimplementowanie i przetestowanie następujących algorytmów sortowania:

Program przyjmuje dwa parametry wejściowe --type insert|merge|quick – określający wykorzystywany algorytm sortowania oraz --comp '>='|'<=' – określający porządek sortowania.
Wejściem dla programu są kolejno:

Program powinien sortować tablicę wybranym algorytmem i wypisywać na standardowym wyjściu błędów wykonywane operacje (porównania, przestawienia). Po zakończeniu sortowania, na standardowym wyjściu błędów powinna zostać wypisana łączna liczba porównań między kluczami, łączna liczba przestawień kluczy oraz czas działania algorytmu sortującego. Finalnie, program sprawdza, czy wynikowy ciąg jest posortowany zgodnie z wybranym porządkiem, a następnie wypisuje na standardowe wyjście liczbę posortowanych elementów oraz posortowaną tablicę.
Przykładowe wywołanie:

./main --type quick --comp '>='
5
9 1 -7 1000 4

kod

Zadanie 2

Uzupełnij program z zadania 1 o możliwość wywołania go z dodatkowym parametrem uruchomienia --stat nazwa_pliku k, wtedy pomija on wczytywanie danych i dla każdego n{100,200,300,,10000}n \in \{100,200,300,\dots,10000\} wykonuje po kk niezależnych powtórzeń:

Po zakończeniu programu, korzystając z zebranych danych przedstaw na wykresach, za pomocą wybranego narzędzia (np. numpy, Matlab, Mathematica):

Zadbaj o to, by dane dotyczące różnych algorytmów sortujących można było nakładać na te same osie i porównywać. Sprawdź, jak wykresy zmieniają się dla różnych kk (np. k=1,k=10,k=1000k=1,k=10,k=1000).

kod

Wykresy wykonałem w Jupyter Notebook (numpy) na podstawie logów wygenerowanych przy pomocy mojego programu.

Zrzuty ekranu wykresów są dostępne bezpośrednio w Jupyter Notebook albo poniżej:

gdzie:

Istnieje możliwość zobaczenia jak zadziałał InsertionSort po uruchomieniu go w Jupyter Notebook (odkomentowanie odpowiednich linijek) jednakże wszystkie wykresy wskazują na to, że InsertionSort jest najgorszym algorytmem z wszystkich:

insertion sort

jako, że pozostałych wykresów praktycznie nie widać bo są tak małe w porównaniu z InsertionSortem.

Zadanie 3

Uzupełnij zadanie 1 o algorytm Dual-pivot QuickSort używając strategii Count:

Dokonaj szczegółowych porównań otrzymanych statystyk dla algorytmu QuickSort i Dual-pivot QuickSort. Eksperymentalnie wyznacz stałą stojącą przy czynniku nln(n)n\ln(n) dla liczby porównań między kluczami.

kod DualPivotQuickSort

Stała przy n ln(n) dla QuickSorta wyniosła 1.6554738137365612
za to dla DualPivotQuickSorta wyniosła 1.5186710672510784.