选择算法-GoLang实现

21 篇文章 0 订阅
13 篇文章 0 订阅

选择算法中利用了快速排序的方法,达到了线性的时间复杂度

RandomizedSelect函数返回切片a的下标p到r中,第i小的数,下面是用GO语言的实现


主要思路和随机快排类似,不过随机快排需要对分割出的两个子序列进行处理,而选择算法只需要对一个进行处理实现了线性的复杂度

package order

import (
	"math/rand"	
)

//RandomizedSelect 返回数组中第i小的元素,i=0表示最小
func RandomizedSelect(a []int, p, r, i int) int{
    if p == r {
        return a[p]
    }
    q := randomPartitoin(a, p, r)
    k := q - p //k表示上一个函数返回的主元在p~r中排第几小
    if k == i {
        return a[q]
    }
    if k > i { //在左边找  
        //fmt.Println("p",p, "q-1", q-1, "i", i)      
        return RandomizedSelect(a, p, q - 1, i)
    }
    //在右边找    
    return RandomizedSelect(a, q + 1, r, i - k - 1)
}

//返回值是主元素的下标
func partition(a []int, p, r int) (q int) {
    x := a[p]
    i := p
    for j := p + 1; j <= r; j++ {
        if x >= a[j] {
            i = i + 1
            a[i], a[j] = a[j], a[i]
        } 
    }
    a[i], a[p] = a[p], a[i]
    return i
}

func randomPartitoin(a []int, p, r int) (q int) {    
    i := p + rand.Intn(r - p + 1)    
    a[i], a[p] = a[p], a[i]
    return partition(a, p, r)
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值