QuickSelect 查找第 K 小的元素

本文深入解析了Quickselect算法,一种用于未排序数组中查找第k小元素的有效方法。该算法基于快速排序,通过多次分区操作直到找到目标元素,提供了一个高效且实用的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 均为下标 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值