Heapsort Koffman & Wolfgang kapitel 8, avsnitt 8 1
Heapsort Mergesort har komplexitet O(n log n) men det kräver temporärt ett extra fält Heapsort kräver inte något extraminne det är en in-place-algoritm som namnet antyder använder algoritmen en heap för att sortera fältet 2
Första versionen av Heapsort En enkel Heapsort-algoritm: skapa en tom heap tag ett element i taget ur fältet och stoppa in i heapen tag sedan ut elementen ur heapen ett i taget och stoppa tillbaka i fältet Denhär versionen kräver extraminne hur gör man detta in-place? 3
Heapsort in-place Antag att vi har ett fält med n element låt första elementet vara en heap med ett element utöka heapen med ett element i taget låt elementet bubbla upp till rätt plats i heapen Nu har vi en heap; hur gör vi den till en lista? byt ut det översta elementet med det sista minska heapens storlek, och låt det nya översta elementet bubbla ner till rätt ställe fortsätt så tills heapen bara har ett element 4 Vi måste bygga heapen som en max-heap, eftersom vi flyttar elementen sist i fältet hela tiden
Trace of Heapsort 89 Heap OK 76 74 37 32 39 66 20 26 18 28 29 6
89 Remove 76 74 37 32 39 66 20 26 18 28 29 6
6 Reheap 76 74 37 32 39 66 20 26 18 28 29 89
76 6 74 37 32 39 66 20 26 18 28 29 89
76 37 74 6 32 39 66 20 26 18 28 29 89
76 37 74 26 32 39 66 20 6 18 28 29 89
76 Heap OK 37 74 26 32 39 66 20 6 18 28 29 89
76 Remove 37 74 26 32 39 66 20 6 18 28 29 89
29 Reheap 37 74 26 32 39 66 20 6 18 28 76 89
74 37 29 26 32 39 66 20 6 18 28 76 89
74 37 66 26 32 39 29 20 6 18 28 76 89
74 Heap OK 37 66 26 32 39 29 20 6 18 28 76 89
74 Remove 37 66 26 32 39 29 20 6 18 28 76 89
28 Reheap 37 66 26 32 39 29 20 6 18 74 76 89
66 37 28 26 32 39 29 20 6 18 74 76 89
66 37 39 26 32 28 29 20 6 18 74 76 89
66 Heap OK 37 39 26 32 28 29 20 6 18 74 76 89
66 Remove 37 39 26 32 28 29 20 6 18 74 76 89
18 Reheap 37 39 26 32 28 29 20 6 66 74 76 89
39 37 18 26 32 28 29 20 6 66 74 76 89
39 37 29 26 32 28 18 20 6 66 74 76 89
39 Heap OK 37 29 26 32 28 18 20 6 66 74 76 89
39 Remove 37 29 26 32 28 18 20 6 66 74 76 89
6 Reheap 37 29 26 32 28 18 20 39 66 74 76 89
37 6 29 26 32 28 18 20 39 66 74 76 89
37 32 29 26 6 28 18 20 39 66 74 76 89
37 Heap OK 32 29 26 6 28 18 20 39 66 74 76 89
37 Remove 32 29 26 6 28 18 20 39 66 74 76 89
20 Reheap 32 29 26 6 28 18 37 39 66 74 76 89
32 20 29 26 6 28 18 37 39 66 74 76 89
32 26 29 20 6 28 18 37 39 66 74 76 89
32 Heap OK 26 29 20 6 28 18 37 39 66 74 76 89
32 Remove 26 29 20 6 28 18 37 39 66 74 76 89
18 Reheap 26 29 20 6 28 32 37 39 66 74 76 89
29 26 18 20 6 28 32 37 39 66 74 76 89
29 26 28 20 6 18 32 37 39 66 74 76 89
29 Heap OK 26 28 20 6 18 32 37 39 66 74 76 89
29 Remove 26 28 20 6 18 32 37 39 66 74 76 89
18 Reheap 26 28 20 6 29 32 37 39 66 74 76 89
28 26 18 20 6 29 32 37 39 66 74 76 89
28 Heap OK 26 18 20 6 29 32 37 39 66 74 76 89
28 Remove 26 18 20 6 29 32 37 39 66 74 76 89
6 Reheap 26 18 20 28 29 32 37 39 66 74 76 89
26 6 18 20 28 29 32 37 39 66 74 76 89
26 20 18 6 28 29 32 37 39 66 74 76 89
26 Heap OK 20 18 6 28 29 32 37 39 66 74 76 89
26 Remove 20 18 6 28 29 32 37 39 66 74 76 89
6 Reheap 20 18 26 28 29 32 37 39 66 74 76 89
20 6 18 26 28 29 32 37 39 66 74 76 89
20 Heap OK 6 18 26 28 29 32 37 39 66 74 76 89
20 Remove 6 18 26 28 29 32 37 39 66 74 76 89
18 Reheap 6 20 26 28 29 32 37 39 66 74 76 89
18 Heap OK 6 20 26 28 29 32 37 39 66 74 76 89
18 Remove 6 20 26 28 29 32 37 39 66 74 76 89
6 Reheap 18 20 26 28 29 32 37 39 66 74 76 89
6 Heap OK 18 20 26 28 29 32 37 39 66 74 76 89
Heapsort, implementering Vi implementerar heapen som ett fält: fältet är uppdelat i en heap-del och en sorterad lista varje element vi tar bort flyttas till slutet av fältet heap-delen av fältet minskar successivt
Heapsort, algoritm Algoritm för In-Place Heapsort 1. while n is less than table.length: 2. increment n by 1 (this inserts a new item into the heap) 3. restore the heap property 4. while the heap is not empty: 5. remove the first item from the heap by swapping it with the last item in the heap 6. restore the heap property
Analys av Heapsort Heapar är logaritmiska: stoppa in/ta bort element är O(log n) att stoppa in n element är O(n log n) att ta bort n element är också O(n log n) O(n log n) + O(n log n) = O(n log n) algoritmen kräver inget extra minne 63