Startuj z nami!

www.szkolnictwo.pl

praca, nauka, rozrywka....

mapa polskich szkół
Nauka Nauka
Uczelnie Uczelnie
Mój profil / Znajomi Mój profil/Znajomi
Poczta Poczta/Dokumenty
Przewodnik Przewodnik
Nauka Konkurs
uczelnie

zamów reklamę
zobacz szczegóły
uczelnie

Sortowanie przez kopcowanie

Sortowanie przez kopcowanie

Sortowanie przez kopcowanie

Animacja przedstawiająca działanie algorytmu Heap sort
Rodzaj Sortowanie
Struktura danych Tablica
Złożoność
CzasowaО(n log(n))
PamięciowaO(1)

Sortowanie kopcem ( ang. heapsort) - zwane też inaczej sortowaniem przez kopcowanie. Algorytm ten jest jedną z ciekawszych metod sortowania z racji faktu, iż jest on szybki oraz nie pochłania zbyt wiele zasobów pamięci . Jego złożoność czasowa to O(n log n), a pamięciowa O(1). Algorytm ten jest w praktyce z reguły nieco wolniejszy od sortowania szybkiego , lecz ma lepszą pesymistyczną złożoność czasową (przez co jest odporny np. na atak za pomocą celowo spreparowanych danych, które spowodowałyby jego znacznie wolniejsze działanie). Sortowanie przez kopcowanie jest niestabilne, co może być czasami uznawane za wadę.

Spis treści

Opis algorytmu

Podstawą algorytmu jest użycie kolejki priorytetowej zaimplementowanej w postaci binarnego kopca zupełnego. Szczegóły implementacji kopca wyjaśnione są w artykułach kopiec i kopiec binarny . Zaletą kopca jest to, że oprócz stałego czasu dostępu do elementu maksymalnego (lub minimalnego) oferuje on logarytmiczny czas wstawiania i usuwania elementów. Ponadto kopiec można łatwo implementować w postaci tablicy .

Algorytm sortowania przez kopcowanie składa się z dwóch faz. W pierwszej sortowane elementy reorganizowane są w celu utworzenia kopca. W drugiej zaś dokonywane jest właściwe sortowanie.

Tworzenie kopca

Podstawową zaletą algorytmu jest to, że do stworzenia kopca wykorzystać można tę samą tablicę, w której początkowo znajdują się nieposortowane elementy. Dzięki temu uzyskuje się stałą złożoność pamięciową.

Początkowo do kopca należy tylko pierwszy element w tablicy. Następnie kopiec rozszerzany jest o drugą, trzecią i kolejne pozycje tablicy, przy czym przy każdym rozszerzeniu, nowy element jest przemieszczany w górę kopca, tak aby spełnione były relacje pomiędzy węzłami. Schematycznie wygląd sortowanej tablicy można przedstawić w następujący sposób:

 -----------------------------------------------------------| Kopiec  | Reszta nieposortowanych elementów               | -----------------------------------------------------------

a kopiec rozrasta się, aż do wyczerpania nieposortowanej części tablicy.

Dzięki logarytmicznej złożoności pojedynczych operacji wstawiania (rozszerzania kopca), całkowita złożoność tego etapu to O(nlog n).

Można też ten krok wykonać szybciej - w czasie O(n). W tym celu należy budować kopiec w następujący sposób:

 -----------------------------------------------------------| Reszta nieposortowanych elementów        | Małe kopce    | -----------------------------------------------------------

Aby osiągnąć taką strukturę, wystarczy pierwsze n div 2 elementów tablicy (zakładając, że kopiec implementujemy w tablicy) przesunąć w dół kopca procedurą shift-down:

 shift-down (T[1..n], i)     k ← i     repeat         j ← k         if 2j <= n and T[2j] > T[k]             k ← 2j         if 2j+1 <= n and T[2j+1] > T[k] and T[2j+1] > T[2j]             k ← 2j+1         swap (T[j], T[k])     until j = k

Zatem procedura budująca kopiec wyglądałaby następująco:

 build-heap (T[1..n])     for i ← n div 2 downto 1         shift-down (T, i)

Procedura build-heap buduje kopiec w czasie O(n).

Sortowanie

Po utworzeniu kopca następuje właściwe sortowanie. Polega ono na usunięciu wierzchołka kopca, zawierającego element maksymalny (minimalny), a następnie wstawieniu w jego miejsce elementu z końca kopca i odtworzenie porządku kopcowego. W zwolnione w ten sposób miejsce, zaraz za końcem zmniejszonego kopca wstawia się usunięty element maksymalny. Operacje te powtarza się aż do wyczerpania elementów w kopcu. Wygląd tablicy można tu schematycznie przedstawić następująco:

 -----------------------------------------------------------| Kopiec elementów do posortowania | Posortowana tablica    | -----------------------------------------------------------

Tym razem kopiec kurczy się, a tablica przyrasta (od elementu ostatniego do pierwszego).

W tej fazie wykonuje się, jak w poprzedniej, n kroków (usuwanie elementu połączone z odtwarzaniem porządku kopcowego), każdy o koszcie logarytmicznym, zatem złożoność tej fazy to także O(nlog n).

Prezentację takiego sortowania można zobaczyć na stronie Sortowanie przez kopcowanie Ww strona zawiera applet prezentujący działanie procedury budującej kopiec z danych zawartych w tablicy oraz umożliwa podgląd zawartości tablicy w postaci drzewa.

Porównanie z innymi algorytmami sortowania

Algorytm sortowania przez kopcowanie jest na ogół nieco wolniejszy niż sortowanie szybkie . Jego przewagą natomiast jest lepsza złożoność pesymistyczna wynosząca O(n log n), podczas gdy dla quicksort jest to O(n2), co jest nie do przyjęcia dla dużych zbiorów danych. Także złożność pamięciowa O(1) jest lepsza niż Ω(log n) algorytmu quicksort.

Heapsort jest nieco wolniejszy od algorytmu sortowania przez scalanie (mergesort), mającego taką samą asymptotyczną złożoność czasową. Mergesort wymaga jednak Ω(n) dodatkowej pamięci. Zaletą mergesort jest prostsza definicja i lepsze zachowanie w przypadkach, gdy dane do sortowania pobierane są z wolnej pamięci masowej; jest też łatwiejszy do zrównoleglenia.


Inne hasła zawierające informacje o "Sortowanie przez kopcowanie":

Podróżnik ...

Dziady (zwyczaj) ...

Pęcice ...

Zambezi ...

Rodzimy Kościół Polski ...

Ren ...

Dzień Zmarłych ...

Dzień Zaduszny ...

Muzeum Zoologiczne Tadasa Ivanauskasa w Kownie ...

II wiek ...


Inne lekcje zawierające informacje o "Sortowanie przez kopcowanie":

Potęgi (plansza 2) ...

10b Wyprzedzanie - część 2 (plansza 11) ...

01 Znaki drogowe - tabliczki do znaków drogowych - część 2 (plansza 20) ...





Zachodniopomorskie Pomorskie Warmińsko-Mazurskie Podlaskie Mazowieckie Lubelskie Kujawsko-Pomorskie Wielkopolskie Lubuskie Łódzkie Świętokrzyskie Podkarpackie Małopolskie Śląskie Opolskie Dolnośląskie