用golang刷算法--堆排序算法

堆排序算法流程

将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了

大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]

小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i+2]

用golang实现

func HeapSort(intList []int) {
	end := len(intList) - 1
	for end >= 0{
		heap(intList, end)
		intList[0], intList[end] = intList[end], intList[0]
		end--
	}
}

func heap(intList []int, end int) {
	i := end
	// 判断end是否是奇数
	if end%2 == 1 {
		// 比较end和其父亲的大小
		if intList[end] > intList[(end-1)/2] {
			// 和父亲交换位置
			intList[end], intList[(end-1)/2] = intList[(end-1)/2], intList[end]
		}
		i = end - 1
	}
	for ; i > 0; i -= 2 {
		// 判断孩子和父亲的大小
		father := intList[(i-2)/2]
		leftChild := intList[i-1]
		rightChild := intList[i]
		maxIndex := i // 两个孩子中大的一个的下标
		if leftChild > rightChild{
			maxIndex = i-1
		}
		if father < intList[maxIndex] {
			intList[(i-2)/2], intList[maxIndex] = intList[maxIndex], intList[(i-2)/2]
		}
	}
}