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个极值

posted @ 2022-03-06 16:48  J0nathan1ei  阅读(168)  评论(0)    收藏  举报