寻找最小的K个数
同上一篇,使用堆排序的方式做。
第一步构建最小堆,构建好之后数组的第一个元素就是最小的;
第二步排序,开始执行k-1次sift,每次将剩余元素中最小的元素放到未排序元素的末尾
第三步,将数组的后k个数返回即为数组中最小的k个数。
func getLeastNumbers(arr []int, k int) []int {
if k == 0 {
return []int{}
}
buildMinHeap(arr)
for i := len(arr) - 1; i > 0; i-- {
arr[i], arr[0] = arr[0], arr[i]
siftDown(arr, 0, i)
}
return arr[len(arr)-k:]
}
func buildMinHeap(arr []int) {
for i := len(arr)/2 - 1; i >= 0; i-- {
siftDown(arr, i, len(arr))
}
}
func siftDown(arr []int, idx, size int) {
left := idx*2 + 1
right := left + 1
smallest := idx
if left < size && arr[left] < arr[smallest] {
smallest = left
}
if right < size && arr[right] < arr[smallest] {
smallest = right
}
if smallest != idx {
arr[smallest], arr[idx] = arr[idx], arr[smallest]
siftDown(arr, smallest, size)
}
}

浙公网安备 33010602011771号