// 选取第一个数作为分区点,做一次调整 partition := nums[l] i := l - 1 j := r + 1 for (i < j) { for i++;nums[i]<partition;i++{} for j--;nums[j]>partition;j--{} if (i < j) { nums[i],nums[j]=nums[j],nums[i] } } // 此时 i = j
// 从乱序的nums数组中找到第k大的数 funcfindKthLargest(nums []int, k int)int { n := len(nums) // 构建一个最小堆 heap := make([]int, k) for i := 0; i < k; i++ { heap[i] = nums[i] } // 建堆 for i := k/2 - 1; i >= 0; i-- { heapify(heap, i, k) } // 遍历数组,如果堆的大小小于k,就把元素放入堆中,如果堆的大小等于k,就把堆顶元素和当前元素比较,如果堆顶元素大于当前元素,就把堆顶元素弹出,把当前元素放入堆中。 for i := k; i < n; i++ { if nums[i] > heap[0] { heap[0] = nums[i] heapify(heap, 0, k) } } return heap[0] }
// 堆化 funcheapify(heap []int, i, n int) { left := 2*i + 1 right := 2*i + 2 min := i if left < n && heap[left] < heap[min] { min = left } if right < n && heap[right] < heap[min] { min = right } if min != i { heap[i], heap[min] = heap[min], heap[i] heapify(heap, min, n) } }
func(h *MinHeap) Pop() interface{} { old := *h n := len(old) x := old[n-1] *h = old[0 : n-1] return x }
funcfindKthLargest(nums []int, k int)int { h := &MinHeap{} heap.Init(h) for i := 0; i < k; i++ { heap.Push(h, nums[i]) } for i := k; i < len(nums); i++ { if nums[i] > (*h)[0] { heap.Pop(h) heap.Push(h, nums[i]) } } return (*h)[0] }