Golang实现堆排序
堆排序的原理是,利用堆数据结构,通过比较,逐步交换父节点、子节点的数值,每次筛选出一个子堆的最值,遍历完数组的所有子堆,最终得到一个有序序列。
func adjustHeap(nums []int, parent, end int) {
child := parent*2 + 1
for child < end {
if child+1 < end && nums[child+1] > nums[child] {
child++
}
if nums[parent] > nums[child] {
return
}
nums[parent], nums[child] = nums[child], nums[parent]
parent = child
child = child*2 + 1
}
}
func buildHeap(nums []int) {
length := len(nums)
for parent := length/2 - 1; parent >= 0; parent-- {
adjustHeap(nums, parent, length)
}
}
func heapSort(nums []int) {
buildHeap(nums)
for i := len(nums) - 1; i > 0; i-- {
nums[0], nums[i] = nums[i], nums[0] // 与末尾元素交换
adjustHeap(nums, 0, i-1) // 调整之前的序列
}
}
由于每次可以求出一个子堆的最值,因此堆排序十分适用于在大数据中,寻找前n个极值

浙公网安备 33010602011771号