package mainimport ( "fmt")//大顶堆 arr对应的索引应该是1,2,3....N,不然没法满足i*2特新,所以索引偏移1func adjust_dui(arr []int, len1 int) { half := len1 / 2 for j := half; j > 0; j-- { i := j * 2 last := j for i <= len1 { if i < len1 { if arr[i-1] < arr[i] { arr[i-1], arr[i] = arr[i], arr[i-1] } } if arr[i-1] > arr[last-1] { //注意此处不是arr[j-1] 不然递归下去不能保证父节点最大 arr[i-1], arr[last-1] = arr[last-1], arr[i-1] } last = i i *= 2 } }}//调整堆进行排序func dui_sort(arr []int, len1 int) { length := len1 - 1 for i := 0; i < len1; i++ { arr[0], arr[length] = arr[length], arr[0] adjust_dui(arr, length) length-- }}func show_arr(arr []int) { len1 := len(arr) for i := 0; i < len1; i++ { fmt.Printf("%d ", arr[i]) } fmt.Printf("\n")}func main() { var arr = []int{10, 5, 6, 19, 35, 24, 17, 5} show_arr(arr) adjust_dui(arr, len(arr)) //第一次也可以称之为创建堆 dui_sort(arr, len(arr)) //以后称之为堆调整 show_arr(arr)}
输出: 5 5 6 10 17 19 24 35