myheap2

//大根堆,根结点为0,左子节点角标为2*k+1,右子节点角标为2*k+2,父节点角标为(k-1)/2
package main
import "fmt"
func HeapSort(s []int) {
    N := len(s)-1 
    for k := (N-1) / 2; k >= 0; k-- {
        sink(s, k, N)
    }
    //下沉排序输出
     for N > 0 {
         swap(s, 0, N) //将大的放在数组后面,升序排序   小根堆:降序排序
         N--
         sink(s, 0, N)
     }
}
 
//下沉(由上至下的堆有序化)
func sink(s []int, k, N int) {
    for {
        l := 2 * k+1  //h(k)的左结点
        if l > N { //循环结束保证该节点是非叶子节点
            break
        }
        if l < N && s[l+1] > s[l] { //选择较大的子节点  小根堆:s[l+1] < s[l]
            l++
        }
        if s[k] >= s[l] { //没下沉到底就构造好堆了   小根堆:  s[k] <= s[l]
            break
        }
        swap(s, k, l)
        k = l
    }
}
 
func swap(s[]int, i int, j int) {
   s[i], s[j] = s[j], s[i]
}

func main() {
s := []int{61,16, 56, 48, 26, 79, 35, 1, 95, 68, 59, 56, 96, 6, 9, 2}
 fmt.Println(s[:])
 HeapSort(s)
 fmt.Println(s[:])
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值