堆排序寻找第K大的数

首先BuildHeap,build heap是指让数组符合堆的性质,最大堆就是根节点的值>=子节点的值。

第一步build完之后,arr[0]就是最大的元素;

然后执行k-1次调整,就会把第k大的元素调整到arr[0]的位置。【要第一大的元素,就不需要再调整了,要第二大就再调整一次,以此类推...】

返回arr[0]即可。

 

func findKthLargest(arr []int, k int) int {
	buildHeap(arr)
	for i := len(arr) - 1; i > len(arr)-k; i-- {
		arr[0], arr[i] = arr[i], arr[0]
		sift(arr, 0, i)
	}
	return arr[0]
}

func buildHeap(arr []int) {
	for i := len(arr)/2 - 1; i >= 0; i-- {
		sift(arr, i, len(arr))
	}
}

func sift(arr []int, idx int, size int) {
	left := idx*2 + 1
	right := left + 1
	largest := idx
	if left < size && arr[left] > arr[largest] {
		largest = left
	}
	if right < size && arr[right] > arr[largest] {
		largest = right
	}
	if largest != idx {
		arr[largest], arr[idx] = arr[idx], arr[largest]
		sift(arr, largest, size)
	}
}

  

posted @ 2022-01-27 20:35  丶Blank  阅读(129)  评论(0编辑  收藏  举报