同上一篇,使用堆排序的方式做。
第一步构建最小堆,构建好之后数组的第一个元素就是最小的;
第二步排序,开始执行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) } }