go语言实现十大经典排序算法---堆排序

堆的特点就是堆顶的元素是一个最值,大顶堆的堆顶是最大值,小顶堆则是最小值。

堆排序就是把堆顶的元素与最后一个元素交换,交换之后破坏了堆的特性,我们再把堆中剩余的元素再次构成一个大顶堆,然后再把堆顶元素与最后第二个元素交换….如此往复下去,等到剩余的元素只有一个的时候,此时的数组就是有序的了。

代码:

//堆排序

func headSort(arr []int) {

    n := len(arr)

    //构建大顶堆

    for i := (n - 2) / 2; i >= 0; i-- {

        downAdjust(arr, i, n-1)

    }

    //进行堆排序

    for i := n - 1; i >= 1; i-- {

        // 把堆顶元素与最后一个元素交换

        temp := arr[i]

        arr[i] = arr[0]

        arr[0] = temp

        // 把打乱的堆进行调整,恢复堆的特性

        downAdjust(arr, 0, i-1)

    }

}



//下沉操作

func downAdjust(arr []int, parent int, n int) {

    //临时保存要下沉的元

    temp := arr[parent]

    //定位左孩子节点的位置

    child := 2*parent + 1

    //开始下沉

    for {

        if child > n {

            break

        }

        // 如果右孩子节点比左孩子大,则定位到右孩子

        if child+1 <= n && arr[child]> arr[child+1]{

            child++

        }

        // 如果孩子节点小于或等于父节点,则下沉结束

        if arr[child]>= temp{

            break

        }

        // 父节点进行下沉

        arr[parent] = arr[child]

        parent = child

        child = 2*parent + 1

    }

    arr[parent] = temp

}

性质:1、时间复杂度:O(nlogn)  2、空间复杂度:O(1)  3、非稳定排序  4、原地排序

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值