MergeSort to klasyczny algorytm typu "dziel i zwyciężaj": dzielimy tablicę na połowy, rekurencyjnie sortujemy każdą połowę, a następnie scalamy (merge) dwie posortowane połowy w jedną posortowaną całość. Kluczowa obserwacja: scalenie dwóch posortowanych tablic można wykonać w czasie liniowym.
| Przypadek | Złożoność czasowa | Uzasadnienie |
|---|---|---|
| Najgorszy / średni / najlepszy | O(n log n) | log n poziomów podziału × O(n) na scalenie każdego poziomu |
| Pamięć | O(n) | Potrzebna dodatkowa tablica pomocnicza do scalania |
MergeSort jest algorytmem stabilnym — elementy o równych kluczach zachowują względną kolejność z tablicy wejściowej. To ważne np. przy sortowaniu rekordów według wielu kryteriów.
Zmodyfikuj MergeSort tak, aby przy okazji zliczył liczbę inwersji w tablicy, czyli par (i, j) takich, że i < j, ale tab[i] > tab[j]. Wskazówka: liczba inwersji przyrasta w funkcji scal, gdy element z prawej tablicy trafia do wyniku przed elementem z lewej.
Mając listę słowników reprezentujących uczniów (imię, średnia_ocen), posortuj ją malejąco według średniej ocen za pomocą MergeSort, dostosowując warunek porównania w funkcji scal.
1. Jaka jest złożoność czasowa MergeSort w każdym przypadku?
2. Ile dodatkowej pamięci wymaga MergeSort?
3. Czy MergeSort jest algorytmem stabilnym?