Golang利用快排思想寻找第K大个数

douyin LSY_HELLOWORLD,已成功入职互联网大厂,请关注我,了解非科班的程序员的工作生活把

快排的思想就是

  1. 寻找一个base,一般令其等于数组第一个元素
  2. 然后将小于等于base的数放base左边,大于的放右边
  3. 分别对左边的和右边的数组进行快排递归
  4. 最后的数组就是完成排序的

寻找第K大个数,
就是在完成快排的时候,判断当前base所在的位置和所需要的位置的情况,然后每次只快排一半就行啦。
代码实现如下:

package main

func main() {
	ans := []int{1332802, 1177178, 1514891, 871248, 753214, 123866, 1615405, 328656, 1540395, 968891, 1884022, 252932, 1034406, 1455178, 821713, 486232, 860175, 1896237, 852300, 566715, 1285209, 1845742, 883142, 259266, 520911, 1844960, 218188, 1528217, 332380, 261485, 1111670, 16920, 1249664, 1199799, 1959818, 1546744, 1904944, 51047, 1176397, 190970, 48715, 349690, 673887, 1648782, 1010556, 1165786, 937247, 986578, 798663}
}

func findKth(a []int, n int, K int) int {
	//这里要做个转换
	//要找第K大的,也就是要找到倒数第K个数,也就是正数第n-K+1个数
	K = n - K + 1
	l, r := 0, n-1
	for l < r {
		cur := quickSort(a[l : r+1])
		//每次快排的数组长短不一,都是相对的位置,因此要加上左边界的长度,才是相对于整个数组的索引位置
		cur = cur + l
		if cur == K-1 {
		//如果刚好是第K个数,就直接返回
			return a[cur]
		} else if cur > K-1 {
			r = cur - 1
		} else {
			l = cur + 1
		}
	}
//最坏情况可能完成排序了,就返回那个位置
	return a[K-1]

}
//快排思想如下
func quickSort(data []int) int {
	n := len(data)
	l, r, i := 0, n-1, 1
	base := data[0]
	for l < r {
		if data[i] <= base {
			data[i], data[l] = data[l], data[i]
			i++
			l++
		} else {
			data[i], data[r] = data[r], data[i]
			r--
		}
	}
	return r
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LSY_HELLOWORLD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值