1. 程式人生 > >QuickSelect 查詢第 K 小的元素

QuickSelect 查詢第 K 小的元素

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 均為下標