Koffman & Wolfgangkapitel 8, avsnitt 8
Heapsort
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 extraminnedet är en in-place-algoritmsom 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 heaptag ett element i taget ur fältet och stoppa in i heapentag sedan ut elementen ur heapen ett i taget och stoppa tillbaka i fältet
Denhär versionen kräver extraminnehur gör man detta in-place?
3
Heapsort in-place
Antag att vi har ett fält med n elementlåt första elementet vara en heap med ett elementutöka heapen med ett element i tagetlå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 sistaminska heapens storlek, och låt det nya översta elementet bubbla ner till rätt ställefortsätt så tills heapen bara har ett element
Vi måste bygga heapen som en max-heap, eftersom vi flyttar elementen sist i fältet hela tiden
4
Trace of Heapsort
89
76 74
37 32 39 66
20 26 18 28 29 6
Heap OK
Trace of Heapsort (cont.)
89
76 74
37 32 39 66
20 26 18 28 29 6
Remove
Trace of Heapsort (cont.)
6
76 74
37 32 39 66
20 26 18 28 29 89
Reheap
Trace of Heapsort (cont.)
76
6 74
37 32 39 66
20 26 18 28 29 89
Trace of Heapsort (cont.)
76
37 74
6 32 39 66
20 26 18 28 29 89
Trace of Heapsort (cont.)
76
37 74
26 32 39 66
20 6 18 28 29 89
Trace of Heapsort (cont.)
76
37 74
26 32 39 66
20 6 18 28 29 89
Heap OK
Trace of Heapsort (cont.)
76
37 74
26 32 39 66
20 6 18 28 29 89
Remove
Trace of Heapsort (cont.)
29
37 74
26 32 39 66
20 6 18 28 76 89
Reheap
Trace of Heapsort (cont.)
74
37 29
26 32 39 66
20 6 18 28 76 89
Trace of Heapsort (cont.)
74
37 66
26 32 39 29
20 6 18 28 76 89
Trace of Heapsort (cont.)
74
37 66
26 32 39 29
20 6 18 28 76 89
Heap OK
Trace of Heapsort (cont.)
74
37 66
26 32 39 29
20 6 18 28 76 89
Remove
Trace of Heapsort (cont.)
28
37 66
26 32 39 29
20 6 18 74 76 89
Reheap
Trace of Heapsort (cont.)
66
37 28
26 32 39 29
20 6 18 74 76 89
Trace of Heapsort (cont.)
66
37 39
26 32 28 29
20 6 18 74 76 89
Trace of Heapsort (cont.)
66
37 39
26 32 28 29
20 6 18 74 76 89
Heap OK
Trace of Heapsort (cont.)
66
37 39
26 32 28 29
20 6 18 74 76 89
Remove
Trace of Heapsort (cont.)
18
37 39
26 32 28 29
20 6 66 74 76 89
Reheap
Trace of Heapsort (cont.)
39
37 18
26 32 28 29
20 6 66 74 76 89
Trace of Heapsort (cont.)
39
37 29
26 32 28 18
20 6 66 74 76 89
Trace of Heapsort (cont.)
39
37 29
26 32 28 18
20 6 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
39
37 29
26 32 28 18
20 6 66 74 76 89
Remove
Trace of Heapsort (cont.)
6
37 29
26 32 28 18
20 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
37
6 29
26 32 28 18
20 39 66 74 76 89
Trace of Heapsort (cont.)
37
32 29
26 6 28 18
20 39 66 74 76 89
Trace of Heapsort (cont.)
37
32 29
26 6 28 18
20 39 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
37
32 29
26 6 28 18
20 39 66 74 76 89
Remove
Trace of Heapsort (cont.)
20
32 29
26 6 28 18
37 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
32
20 29
26 6 28 18
37 39 66 74 76 89
Trace of Heapsort (cont.)
32
26 29
20 6 28 18
37 39 66 74 76 89
Trace of Heapsort (cont.)
32
26 29
20 6 28 18
37 39 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
32
26 29
20 6 28 18
37 39 66 74 76 89
Remove
Trace of Heapsort (cont.)
18
26 29
20 6 28 32
37 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
29
26 18
20 6 28 32
37 39 66 74 76 89
Trace of Heapsort (cont.)
29
26 28
20 6 18 32
37 39 66 74 76 89
Trace of Heapsort (cont.)
29
26 28
20 6 18 32
37 39 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
29
26 28
20 6 18 32
37 39 66 74 76 89
Remove
Trace of Heapsort (cont.)
18
26 28
20 6 29 32
37 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
28
26 18
20 6 29 32
37 39 66 74 76 89
Trace of Heapsort (cont.)
28
26 18
20 6 29 32
37 39 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
28
26 18
20 6 29 32
37 39 66 74 76 89
Remove
Trace of Heapsort (cont.)
6
26 18
20 28 29 32
37 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
26
6 18
20 28 29 32
37 39 66 74 76 89
Trace of Heapsort (cont.)
26
20 18
6 28 29 32
37 39 66 74 76 89
Trace of Heapsort (cont.)
26
20 18
6 28 29 32
37 39 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
26
20 18
6 28 29 32
37 39 66 74 76 89
Remove
Trace of Heapsort (cont.)
6
20 18
26 28 29 32
37 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
20
6 18
26 28 29 32
37 39 66 74 76 89
Trace of Heapsort (cont.)
20
6 18
26 28 29 32
37 39 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
20
6 18
26 28 29 32
37 39 66 74 76 89
Remove
Trace of Heapsort (cont.)
18
6 20
26 28 29 32
37 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
18
6 20
26 28 29 32
37 39 66 74 76 89
Heap OK
Trace of Heapsort (cont.)
18
6 20
26 28 29 32
37 39 66 74 76 89
Remove
Trace of Heapsort (cont.)
6
18 20
26 28 29 32
37 39 66 74 76 89
Reheap
Trace of Heapsort (cont.)
6
18 20
26 28 29 32
37 39 66 74 76 89
Heap OK
Heapsort, implementering
Vi implementerar heapen som ett fält:
fältet är uppdelat i en heap-del och en sorterad listavarje element vi tar bort flyttas till slutet av fältetheap-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 property4.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