Skip to content

Latest commit

 

History

History
63 lines (41 loc) · 3 KB

heap_sort.md

File metadata and controls

63 lines (41 loc) · 3 KB

Heap sort

En max-heap er sortert slik at rot-noden er den største noden av alle nodene i heapen. Alle forelder-noder i heapen er større en barne-nodene sine. For Min-heap er det motsatt.

Heapsort begynner med å bygge en max-heap (Build-max-heap) av en liste med tall. Man sikrer dermed en gyldig Max-heap hvor rot-noden er den største noden i heapen.

Heapsort henter derette ut roten (det største tallet) og trekker opp en av nodene fra bunnen og setter den som ny rot. Nå er alle sub-grafene til roten en max-heap, men roten i seg selv gjør at hele treet er feil (ettersom den er av lav verdi).

Ved å kjøre max-heapify vil man nok en gang kunne hente opp det største tallet i heapen. Dette tallet kan igjen hentes ut og erstattes med et lavt tall fra bunnen av heapen.

Algoritmen utnytter altså at max-heapify alltid finner maximum i heapen og bruker dette til å sortere den originale listen.

Den formelle definisjonen av det generelle problemet

Tilleggskrav for korrekthet

Trinn for trinn

Heapsort

build-max-heap

max-heapify

Korrekthetsbevis

Styrker og svakheter sammenlignet med andre

  • In-place: Ja
  • Stabil: Nei, Heap sort er typisk ustabil, men kan bli implementert som stabil. Den vil vanligvis endre den relative rekkefølgen ved duplikat-verdier.

Kjøretid og utregning

The HEAPSORT procedure takes time $O(n \log n)$ since the call to BUILD-MAXHEAP takes time $O(n)$ and each of the $n-1$ calls to MAX-HEAPIFY takes time $O(\log n)$

Best case Average case Worst case Minne
$O(n \log n)$ ??? $O(n \log n)$ $O(1)$

Heapsort bygger først en max-heap ved hjelp av Build-max-heap. Nå er det største elementet på toppen. Dette elementet hentes ut fra heapen. Den flytter så en av de minste elementene helt til toppen før den kjører Max-heapify igjen.

Max-heapify garanterer at det største elementet i heapen nok en gang kommer til toppen. Denne prosessen gjør det mulig å hente ut det største elementet i heapen hver gang.

$O(n \log (n))$ kommer av at det kjøres Max-heapify for hvert element.

Python kodeeksempel