算法代码实现之堆排序,Golang(Go语言)实现
2016-03-01 20:41
447 查看
封装成函数:
测试:
输出:
[9065821743]
[0123456789]
//堆排序
//s[0]不用,实际元素从角标1开始
//父节点元素大于子节点元素
//左子节点角标为2*k
//右子节点角标为2*k+1
//父节点角标为k/2
funcHeapSort(s[]int){
N:=len(s)-1//s[0]不用,实际元素数量和最后一个元素的角标都为N
//构造堆
//如果给两个已构造好的堆添加一个共同父节点,
//将新添加的节点作一次下沉将构造一个新堆,
//由于叶子节点都可看作一个构造好的堆,所以
//可以从最后一个非叶子节点开始下沉,直至
//根节点,最后一个非叶子节点是最后一个叶子
//节点的父节点,角标为N/2
fork:=N/2;k>=1;k--{
sink(s,k,N)
}
//下沉排序
forN>1{
swap(s,1,N)//将大的放在数组后面,升序排序
N--
sink(s,1,N)
}
}
//下沉(由上至下的堆有序化)
funcsink(s[]int,k,Nint){
for{
i:=2*k
ifi>N{//保证该节点是非叶子节点
break
}
ifi<N&&s[i+1]>s[i]{//选择较大的子节点
i++
}
ifs[k]>=s[i]{//没下沉到底就构造好堆了
break
}
swap(s,k,i)
k=i
}
}
funcswap(s[]int,iint,jint){
s[i],s[j]=s[j],s[i]
}
测试:
s:=[]int{-1,9,0,6,5,8,2,1,7,4,3}
fmt.Println(s[1:])
HeapSort(s)
fmt.Println(s[1:])
输出:
[9065821743]
[0123456789]
相关文章推荐
- 【CodeForces】A. Dragons
- 熟悉一下GO的AES加密库
- Django~static files
- Django中的F表达式来解决丢失修改问题
- 关于Go语言共享内存操作的小实例
- Xcode警告Category is implementing a method which will also be implemented by its primary class 处理
- POJ2195 Going Home(SPFA最小费用最大流)
- go liteIDE
- Django 路由
- django:field字段类型
- mongo2.4_point_in_time_recovery
- USACO 2016 Jan Gold 愤怒的奶牛(Angry Cows)
- 如何在WindowsAzure上搭建Mean stack环境之如何在中国版Azure上搭MangoDB
- google perftools分析程序性能
- django1.9的static文件配置
- 减少集成google-play-service-lib后编译的apk的大小
- Go语言三大框架点评
- 操作系统 之 银行家算法
- Django:locals()小技巧
- Go语言异常处理defer\panic\recover