-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathheapsort.go
66 lines (57 loc) · 1.06 KB
/
heapsort.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// You can edit this code!
// Click here and start typing.
package main
import (
"fmt"
)
type maxHeap struct {
data []int
}
func (h *maxHeap) Left(i int) int {
return 2*i + 1
}
func (h *maxHeap) Right(i int) int {
return 2*i + 2
}
func (h *maxHeap) Parent(i int) int {
return (i - 1) / 2
}
// o(log n)
func (h *maxHeap) Heapify(i int, n int) {
largest := i
l := h.Left(i)
r := h.Right(i)
if l < n && h.data[l] > h.data[largest] {
largest = l
}
if r < n && h.data[r] > h.data[largest] {
largest = r
}
if largest != i {
h.data[largest], h.data[i] = h.data[i], h.data[largest]
h.Heapify(largest, n)
}
}
// o(n)
func (h *maxHeap) BuildHeap(arr []int) {
h.data = arr
for i := h.Parent(len(h.data) - 1); i >= 0; i-- {
h.Heapify(i, len(h.data))
}
}
func (h *maxHeap) Sort() {
for i := len(h.data) - 1; i > 0; i-- {
h.data[i], h.data[0] = h.data[0], h.data[i]
h.Heapify(0, i)
}
}
func (h *maxHeap) Print() {
fmt.Println(h.data)
}
func main() {
h := new(maxHeap)
buildHeap := []int{10, 15, 50, 4, 20}
h.BuildHeap(buildHeap)
h.Sort()
h.Print()
}