Go语言实现快速选择

本文介绍了如何使用Go语言实现快速选择算法,该算法能在平均时间复杂度为O(n)的情况下,解决从海量数据中找到第k大数字的问题。虽然快速选择在遇到重复数字时可能导致循环,但通过适当调整可以应对这种情况。
摘要由CSDN通过智能技术生成

偶尔间看到一个问题:从海量数字中找到第k大的数

脑子里蹦出来的第一个念头是堆,复杂度O(nlogk)。后来想想好像在某些情况下可以用快速选择的思想,能达到O(n)。

快速选择的思想很简单,在快速排序的基础上实现,比如选择数字p为比较值,将一组数分为两半,我们将数字p的索引i与k比较就能知道第k个数字是在索引i的左边还是右边,还是恰好是i直接返回,接着只对包含k的那一边继续做相同过程就可以了。下面是go代码实现。

Tab:    其中加入了输出过程,来观察每一步的结果。

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	org := rand.Perm(10)
	value := 7
	fmt.Println("原始切片: ", org)
	fmt.Printf(" 第%d个值: %d\n", value, findKthLargest(org, 0, len(org)-1, value))
	fmt.Println("最终切片: ", org)
}

func findKthLargest(s []int, start, end, k int) int {
	p := s[end]
	l := start
	for i := start; i < end; i++ {
		if s[i] <= p {
			fmt.Println("    交换:  i-&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值