您的位置:首页 > 编程语言 > Go语言

算法代码实现之选出第k小元素、中位数、最小的k个元素(线性复杂度),Golang(Go语言)实现

2016-03-02 21:25 1291 查看
封装成函数:

//选出第k小元素,k为1~len(s)
funcSelectKthMin(s[]int,kint)int{
k--
lo,hi:=0,len(s)-1
for{
j:=partition(s,lo,hi)
ifj<k{
lo=j+1
}elseifj>k{
hi=j-1
}else{
returns[k]
}
}
}
//选出中位数(比一半的元素小,比另一半的大)
funcSelectMid(s[]int)int{
	returnSelectKthMin(s,len(s)/2)
}
//选出k个最小元素,k为1~len(s)
funcSelectKMin(s[]int,kint)[]int{
lo,hi:=0,len(s)-1
for{
j:=partition(s,lo,hi)
ifj<k{
lo=j+1
}elseifj>k{
hi=j-1
}else{
			returns[:k]
}
}
}
funcpartition(s[]int,lo,hiint)int{
	i,j:=lo,hi+1
for{
	for{
i++
			ifi==hi||s[i]>s[lo]{
break
}
}
	for{
j--
			ifj==lo||s[j]<=s[lo]{
break
}
}
		ifi>=j{
break
}
		swap(s,i,j)
}
	swap(s,lo,j)
	returnj
}
funcswap(s[]int,iint,jint){
	s[i],s[j]=s[j],s[i]
}


测试:

s:=[]int{9,0,6,5,8,2,1,7,4,3}
fmt.Println(SelectKthMin(s,1))//第1小元素:0
fmt.Println(SelectMid(s))//中位数:4
fmt.Println(SelectKMin(s,5))//最小的5个数:0~4


输出:

0

4

[01234]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: