堆排序

package main

import (
	"fmt"
)

//大顶堆 arr对应的索引应该是1,2,3....N,不然没法满足i*2特新,所以索引偏移1
func 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

你可能感兴趣的:(堆排序)