QuickSelect 查詢第 K 小的元素
阿新 • • 發佈:2018-12-19
Quick select
演算法通常用來在未排序的陣列中尋找第 k 小/第 k 大的元素。其方法類似於 Quick sort。
本質上是通過多次快速排序,當某次快速排序的樞紐元素恰好下標為 k-1 時,結束查詢~
package main import "fmt" func core(nums []int, k, start, end int) int { left, right := start, end key := nums[left] for left < right { for left < right && nums[right] >= key { right -- } nums[left] = nums[right] for left < right && nums[left] <= key { left ++ } nums[right] = nums[left] } nums[left] = key //left 是下標,k 也是下標 if left < k { return core(nums, k, left+1, end) } else if left > k { return core(nums, k, start, left-1) } return nums[left] } func findKSmallestNum(nums []int, k, start, end int) int { return core(nums, k-1, start, end) } func main() { nums := []int{1, 3, 2, 6, 5, 4} result := findKSmallestNum(nums, 3, 0, 5) fmt.Println(result) }
注意快速排序的寫法,注意 k 和 left 均為下標