Skip to content

Commit 36a10e3

Browse files
committed
add heapify
1 parent dfae0dd commit 36a10e3

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

slice/slice.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,3 +160,35 @@ func Align[T any](k []T, v []T, less func(T, T) bool) []Pair[*T, *T] {
160160
return lis
161161

162162
}
163+
164+
func Heapify[T any](arr []T, n, i int, less func(T, T) bool) {
165+
largest := i
166+
l := 2*i + 1
167+
r := 2*i + 2
168+
169+
if l < n && less(arr[largest], arr[l]) {
170+
largest = l
171+
}
172+
if r < n && less(arr[largest], arr[r]) {
173+
largest = r
174+
}
175+
if largest != i {
176+
arr[i], arr[largest] = arr[largest], arr[i]
177+
Heapify(arr, n, largest, less)
178+
}
179+
}
180+
181+
func BuildMaxHeap[T any](arr []T, less func(T, T) bool) {
182+
n := len(arr)
183+
for i := (n / 2) - 1; i >= 0; i-- {
184+
Heapify(arr, n, i, less)
185+
}
186+
}
187+
188+
func HeapSort[T any](arr []T, less func(T, T) bool) {
189+
BuildMaxHeap(arr, less)
190+
for i := len(arr) - 1; i > 0; i-- {
191+
arr[0], arr[i] = arr[i], arr[0]
192+
Heapify(arr, i, 0, less)
193+
}
194+
}

slice/slice_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,21 @@ func TestAlign(t *testing.T) {
5151
}
5252

5353
func ptr[T any](v T) *T { return &v }
54+
55+
func TestHeapSort(t *testing.T) {
56+
is := is.New(t)
57+
58+
arr := []int{9, 4, 3, 8, 10, 2, 5}
59+
slice.HeapSort(arr, func(l, r int) bool { return l < r })
60+
61+
is.Equal(arr, []int{2, 3, 4, 5, 8, 9, 10})
62+
}
63+
64+
func TestBuildHeap(t *testing.T) {
65+
is := is.New(t)
66+
67+
arr := []int{1, 3, 5, 4, 6, 13, 10, 9, 8, 15, 17}
68+
slice.BuildMaxHeap(arr, func(l, r int) bool { return l < r })
69+
70+
is.Equal(arr, []int{17, 15, 13, 9, 6, 5, 10, 4, 8, 3, 1})
71+
}

xdg/xdg.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ func setENV(name, value string) string {
3939
func Get(base, suffix string) string {
4040
return strings.Join(paths(base, suffix), string(os.PathListSeparator))
4141
}
42+
func GetRoot(base, suffix string, perm os.FileMode) (*os.Root, error) {
43+
fs, err := os.OpenRoot(base)
44+
if err != nil {
45+
return nil, err
46+
}
47+
err = fs.Mkdir(Get(base, suffix), perm)
48+
if err != nil {
49+
return nil, err
50+
}
51+
return os.OpenRoot(Get(base, suffix))
52+
}
4253
func paths(base, suffix string) []string {
4354
paths := strings.Split(os.ExpandEnv(base), string(os.PathListSeparator))
4455
for i, path := range paths {

0 commit comments

Comments
 (0)