Ten artykuł należy dopracować:
Sortowanie przez łączenie naturalne
Rodzaj
|
Sortowanie
|
Złożoność
|
Czasowa
|
|
Pamięciowa
|
|
Sortowanie przez łączenie naturalne jest zaliczane do grupy sortowań zewnętrznych, tzn. operuje na taśmach. Taśmą możemy nazwać dowolny plik o dostępie sekwencyjnym (tzn. w danym momencie dostępny jest tylko jeden element takiego pliku), niemożliwe jest więc wykorzystywanie tradycyjnych metod sortowania.
W wypadku plików o dostępie sekwencyjnym czasy dostępu do określonej pozycji są zbyt duże, aby można było sortować je "w miejscu" - czyli bezpośrednio na nośniku. Niesekwencyjny dostęp do sortowanego pliku ograniczałby również funkcjonalność buforów zapewniających szybszy dostęp do danych.
Głównym zastosowaniem sortowań zewnętrznych jest porządkowanie danych nie mogących zmieścić się w pamięci operacyjnej, przy zachowaniu wymogu sekwencyjnego dostępu do pliku.
Sortowanie przez łączenie, które zawsze scala dwa najdłuższe podciągi posortowane nazywa się sortowaniem przez łączenie naturalne. Wykorzystywany jest fakt, że w plikach znajdują się dane częściowo posortowane (serie) - scalenie serii a o długości m i serii b o długości n w serię c o długości m+n jest dużo wydajniejsze od ich sortowania.
Występują dwie fazy: dzielenia (dzielimy taśmę na dwie taśmy pomocnicze) i łączenia (scalamy taśmy pomocnicze). Przebiegiem nazywamy te dwie fazy występujące po sobie.
Przykładowy zbiór danych:
- 1 5 2 3 8 10 4 2 7 5 8 9 1
i serie naturalne w nim, wyróżnione za pomocą nawiasów:
- [1 5] [2 3 8 10] [4] [2 7] [5 8 9] [1]
W sortowaniu takim wykorzystuje się 3 taśmy.
W dalszym opisie przyjęto, że c to taśma danych, zaś a i b to taśmy pomocnicze.
Algorytm postępowania
1. Kopiujemy dane z pliku źródłowego do taśmy c.
faza dzielenia:
2. Szukamy serii i kopiujemy je na przemian do taśmy a oraz b - po tej operacji w taśmach powinna się znajdować równa liczba serii (ale zwykle tak nie jest - patrz uwagi)
faza łączenia:
3. Bierzemy po jednej serii z każdej z taśm (a i b) i scalamy je do taśmy c
4. Powtarzamy punkt 3 tak długo, aż serie w którejś z taśm się skończą - najlepszy przypadek to taki, w którym udało się doprowadzić do wyczerpania serii w tym samym czasie. Jeśli w którejś z taśm jeszcze są serie, kopiujemy to co zostało na koniec taśmy c
5. Powtarzamy punkty 2-4 do momentu, gdy w taśmie c będzie tylko jedna seria
przepisanie danych:
6. Kopiujemy zawartość taśmy c do pliku wynikowego
Uwagi
Podczas wykonywania punktu 3 może się zdarzyć, że serie w taśmach pomocniczych się połączą, wtedy jest jedna seria mniej
| - podział serii
? - ten podział serii zniknął w wyniku podziału taśmy
dane: 1 5 6 2 20 8 9 1 5
c: 1 5 6 | 2 20 | 8 9 | 1 5
po fazie dzielenia mamy
a: 1 5 6 ? 8 9
b: 2 20 | 1 5
Nieparzysta liczba serii nie podzieli się równo na 2.
Walczyć z tym można pisząc odpowiednie procedury dzielące (tzn. tworzące dodatkowe serie).