add heapify
Some checks failed
Go Bump / bump (push) Successful in 55s
Go Test / build (push) Failing after 1m10s

This commit is contained in:
xuu
2025-09-22 16:41:55 -06:00
parent dfae0ddbcc
commit 36a10e319f
3 changed files with 61 additions and 0 deletions

View File

@@ -160,3 +160,35 @@ func Align[T any](k []T, v []T, less func(T, T) bool) []Pair[*T, *T] {
return lis
}
func Heapify[T any](arr []T, n, i int, less func(T, T) bool) {
largest := i
l := 2*i + 1
r := 2*i + 2
if l < n && less(arr[largest], arr[l]) {
largest = l
}
if r < n && less(arr[largest], arr[r]) {
largest = r
}
if largest != i {
arr[i], arr[largest] = arr[largest], arr[i]
Heapify(arr, n, largest, less)
}
}
func BuildMaxHeap[T any](arr []T, less func(T, T) bool) {
n := len(arr)
for i := (n / 2) - 1; i >= 0; i-- {
Heapify(arr, n, i, less)
}
}
func HeapSort[T any](arr []T, less func(T, T) bool) {
BuildMaxHeap(arr, less)
for i := len(arr) - 1; i > 0; i-- {
arr[0], arr[i] = arr[i], arr[0]
Heapify(arr, i, 0, less)
}
}

View File

@@ -51,3 +51,21 @@ func TestAlign(t *testing.T) {
}
func ptr[T any](v T) *T { return &v }
func TestHeapSort(t *testing.T) {
is := is.New(t)
arr := []int{9, 4, 3, 8, 10, 2, 5}
slice.HeapSort(arr, func(l, r int) bool { return l < r })
is.Equal(arr, []int{2, 3, 4, 5, 8, 9, 10})
}
func TestBuildHeap(t *testing.T) {
is := is.New(t)
arr := []int{1, 3, 5, 4, 6, 13, 10, 9, 8, 15, 17}
slice.BuildMaxHeap(arr, func(l, r int) bool { return l < r })
is.Equal(arr, []int{17, 15, 13, 9, 6, 5, 10, 4, 8, 3, 1})
}