Algorytmy sortowania - Politechnika Poznańska
Transkrypt
Algorytmy sortowania - Politechnika Poznańska
Poniedziałki 11.45 Grupa I3 Informatyka na wydziale Informatyki Politechnika Poznańska Algorytmy I Struktury Danych Prowadząca: dr Hab. inż. Małgorzata Sterna Sprawozdanie do Ćwiczenia 1 – Algorytmy sortowania (27.02.12) Autorzy: Oliwer Kostera nr indeksu 106552 Adam Matuszewski nr indeksu 106550 1. Implementacja metod sortowania. Do implementacji metod sortowania posłużyliśmy się językiem C. Każda z metod została napisana w odrębnej funkcji. Do mierzenia czasu poszczególnych metod użyliśmy funkcji clock() z bibliotek time.h. 2. Badana zależność czasu obliczeń t[s] od liczby sortowanych elementów n. n Insertion Selestion Sort Sort t[s] t[s] Bubble Sort t[s] Heap Sort t[s] Quick Sort* t[s] Merge Sort t[s] Counting Sort t[s] 20000 0,46 0,78 2,29 0,01 0,00 0,01 0,00 40000 1,87 3,14 9,13 0,01 0,01 0,01 0,00 60000 4,20 7,04 20,52 0,02 0,02 0,01 0,00 70000 5,73 9,57 27,86 0,02 0,02 0,02 0,00 80000 7,57 12,51 36,46 0,03 0,02 0,02 0,00 90000 9,45 15,83 46,17 0,04 0,02 0,03 0,01 100000 11,69 19,54 56,93 0,04 0,02 0,03 0,01 120000 16,78 28,16 82,01 0,05 0,02 0,04 0,01 150000 26,17 44,15 128,35 0,06 0,03 0,04 0,01 200000 47,03 78,68 226,07 0,07 0,04 0,06 0,01 300000 104,60 179,53 536,91 0,14 0,08 0,09 0,02 400000 195,40 328,67 955,88 0,19 0,10 0,12 0,04 500000 304,88 514,14 1492,83 0,25 0,13 0,16 0,05 750000 691,20 1163,54 3356,55 0,38 0,21 0,26 0,09 1000000 1246,62 2062,72 5829,55 0,53 0,28 0,33 0,09 *- metoda Quick Sort z podziałem wg środkowego elementu Zakres liczb [1, n]. 7000 6000 5000 t[s] 4000 3000 2000 1000 0 40000 20000 70000 60000 80000 90000 120000 200000 400000 750000 100000 150000 300000 500000 1000000 n Insertion Sort Selection Sort Bubble Sort 0.6 0.5 0.4 t[s] 0.3 0.2 0.1 0 40000 20000 70000 60000 80000 90000 120000 200000 400000 750000 100000 150000 300000 500000 1000000 n Heap Sort Quick Sort Merge Sort Counting Sort Wnioski: -metody Heap Sort, Quick Sort, Merge Sort i Counting Sort są algorytmami szybszymi jak widać na powyższych wykresach co czyni je efektywniejszymi, -najszybszym algorytmem z metod „szybkich” dla n z zakresu [20000, 1000000] jest Counting Sort, natomiast najwolniejsza Heap Sort, -najszybszym algorytmem z metod „wolnych” dla n z zakresu [20000, 1000000] jest Insertion Sort, natomiast najwolniejsza Bubble Sort, Na efektywność algorytmów sortowania ma wpływ między innymi liczba sortowanych elementów, rozkład i zakres elementów czy złożoność obliczeniowa. Powyższe algorytmy możemy podzielić ze względu na wrażliwość na dane wejściowe, złożoność obliczeniową, stabilność czy zajmowanie pamięci. Wszystkie metody „szybkie” maja złożoność O(n*logn), natomiast metody „wolne” O(n2). Do algorytmów stabilnych możemy zaliczyć MS, CS, IS i BS. Wrażliwe na dane wejściowe są IS, CS, QS i HS. Metodami działającymi w miejscu są wszystkie algorytmy „wolne” oraz HS. 3. Metody szybkie QS, a metoda IS dla losowego i rosnącego rozkładu danych. n IS(losowe) QSs*(losowe) QSe*(losowe) IS(rosnące) QSs(rosnące) QSe(rosnące) t[s] t[s] t[s] t[s] t[s] t[s] 40000 1,87 0,01 0,01 0 0,01 1,72 60000 4,2 0,02 0,02 0 0,01 3,86 70000 5,73 0,02 0,02 0 0,01 5,24 80000 7,57 0,02 0,02 0 0,01 6,85 90000 9,45 0,02 0,02 0 0,01 8,66 100000 11,69 0,02 0,03 0 0,01 10,67 120000 16,78 0,02 0,03 0 0,01 15,33 150000 26,17 0,03 0,03 0 0,01 23,04 160000 31,5 0,04 0,04 0 0,02 26,16 170000 34,83 0,05 0,04 QSs- Quick Sort z pivotem na środku Qse- Quick Sort z pivotem na skraju 0 0,02 29,62 40 35 30 t[s] 25 20 15 10 5 0 40000 60000 70000 80000 90000 100000 120000 150000 160000 170000 n IS(losowo) Qss(losowo) Qse(losowo) IS(rosnąco) Qsm(rosnąco) Qse(rosnąco) Wnioski dla metody szybkiej QS: -punkt podziału tablicy znacznie wpływa na efektywność tej metody, w przypadku rozkładu losowego danych, czasy wykonywania algorytmów były podobne, natomiast dla rozkładu losowego złożoność obliczeniowa metody z piwotem w środku tablicy rosła aż do O(n2). -najgorszym przypadkiem dla metody z podziałem wg skrajnego elementu jest ciąg posortowany rosnąco lub malejąco, wpływ ma na to ilość wykonywanych iteracji (mediana ciągu znajduje się w środku), -najlepszym przypadkiem dla algorytmu z podziałęm wg środkowego elementu jest najgorszy przypadek dla metody z podziałem wg skrajnego elementu, -najgorszym przypadkiem dla metody z piwotem w środku są ciągi A lub Vkształtne, -najlepsza wersją wyboru punktu podziału jest znalezienie mediany ciągu i w tym miejscu jego ustawienie, zaletą tego jest utrzymanie złożoności O(n*logn), natomiast wadą wymagany dodatkowy czas, -metoda szybka posiada niejawne wymaganie pamięciowe w postaci odkładania wartości na stos przy rekurencji. Metoda szybka a metoda IS. Z wyżej otrzymanych wyników, możemy wnioskować, że efektywniejszym algorytmem jest QS od IS. Nawet w przypadku gdy złożoność QS rośnie do O(n2) to nadal jest szybsza metodą jak IS dla losowych elementów. Algorytm IS jest tym lepszym tylko w przypadku gdy wiemy, że dane są już posortowane (złożoność O(n)), nie wymaga wtedy żadnej pamięci w przeciwieństwie do QS. Podstawowe wady i zalety poszczególnych algorytmów. Insertion Sort: -zalety: stabilna, działą w miejscu, zachowanie naturalne, najszybsza z metod „wolnych”, -wady: jak każda metoda „wolna” złożoność obliczeniowa O(n2) Selection Sort: -zalety: działa w miejscu, niewrażliwa na dane wejśćiowe, -wady: niestabilna, bardzo dużo porównań, bardzo słabe zachowanie naturalne, złożoność O(n2), Bubble Sort: -zalety: działa w miejscu, jest stabilna, -wady: najwolniejsza z metod „wolnych”, słabe zachowanie naturalne, złożoność O(n2), Heap Sort: -zalety: działa w miejscu, mało wrażliwa na układ danych wejściowych, złożoność w przypadku pesymistycznym O(n*logn), a optymistycznym O(n), stabilna, -wady: zachowanie nienaturalne, najwolniejsza z metod „szybkich”, Quick Sort: -zalety: jedna z najszybszych metod w typowych warunkach, -wady: niejawne wymagania pamięciowe, wrażliwa na dane wejściowe, jedyna z metod „szybkich” dla których złożoność może urosnąć do O(n2) Merge Sort: -zalety: stabilna, mniej porównań od QS, -wady: nie działa w miejscu, Counting Sort: -zalety: niewrażliwa na rozkład danych wejściowych, zlożoność liniowa, -wady: działa tylko dla liczb naturalnych, duże zapotrzebowania pamięciowe, silna zależność od zakresu danych wejściowych (może też być zaletą), 4. Metoda CS a QS. n QS CS QS CS (zakres 0,01*n) (zakres 0,01*n) (zakres 100*n) (zakres 100*n) t[s] t[s] t[s] t[s] 50000 0,02 0 0,01 0,07 100000 0,03 0 0,02 0,11 200000 0,07 0 0,04 0,39 300000 0,11 0,01 0,08 0,37 400000 0,15 0,01 0,10 0,75 500000 0,18 0,01 0,13 0,71 600000 0,22 0,02 0,15 0,91 700000 0,26 0,02 0,15 0,91 900000 0,33 0,01 0,24 1,33 1000000 0,37 0,02 0,27 1,72 Zakres [1, 0,01*n] 0.4 0.35 0.3 t[s] 0.25 0.2 0.15 0.1 0.05 0 50000 100000 200000 300000 400000 500000 600000 700000 900000 1000000 n QS CS Zakres [1, 100*n] 2 1.8 1.6 1.4 t[s] 1.2 1 0.8 0.6 0.4 0.2 0 50000 100000 200000 300000 400000 500000 600000 700000 900000 1000000 n QS CS