golang 堆排序

package main

func main() {
	A := []int{3, 6, 9, 7, 8, 4, 2, 10}
	fmt.Println(A)

	HeapSort(A)	
	fmt.Println(A)
}

func Parent(i int) int {
	return (i - 1) / 2
}

func Left(i int) int {
	return 2*i + 1
}

func Right(i int) int {
	return 2*i + 2
}

func MaxHeapify(A []int, i, heapsize int) {
	largest := i

	l := Left(i)
	r := Right(i)

	if l < heapsize && A[l] > A[largest] {
		largest = l
	}

	if r < heapsize && A[r] > A[largest] {
		largest = r
	}

	if i != largest {
		A[i], A[largest] = A[largest], A[i]
		MaxHeapify(A, largest, heapsize)
	}
}

func BuildMaxHeap(A []int) {
	heapsize := len(A)
	last := len(A) - 1

	p := Parent(last)
	for i := p; i >= 0; i-- {
		MaxHeapify(A, i, heapsize)
	}
}

func HeapSort(A []int) {
	BuildMaxHeap(A)

	heapsize := len(A)
	last := len(A) - 1

	for i := last; i > 0; i-- {
		A[i], A[0] = A[0], A[i]

		heapsize--
		MaxHeapify(A, 0, heapsize)
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值