排序算法之堆排序

  • 原理
    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构。

  • 堆说明
    性质:完全二叉树或者是近似完全二叉树
    分类:大根堆(父节点总是大于子节点)、小根堆(父节点总是小于子节点)
    左右节点:无大小顺序

  • 步骤
1:对于给定的数据序列建堆
2:输出堆顶(首尾元素互相交换)
3:调整剩余元素,重建堆
4:重复2-3直到所有元素有序
  • 性能
    时间复杂度:由于每次调整堆的时间复杂度为O(logN),共N - 1次堆调整操作,再加上前面建立堆时N / 2次向下调整,每次调整时间复杂度也为O(logN)。两次次操作时间相加还是O(N * logN)。故堆排序的时间复杂度为O(N * logN)
    空间负责度:O(1)

  • 实现

func adjust(arr []int, start, end int) {
    tmp := arr[start]
    i := 0
    for i = 2*start + 1; i <= end; i *= 2 {
        if i < end && arr[i] < arr[i+1] {
            i++
        } //保存左右孩子中较大值
        if arr[i] > tmp {
            arr[start] = arr[i]
            start = i
        } else {
            break
        }
    }
    arr[start] = tmp
}

func heapSort(arr []int) {
    var tmp int
    length := len(arr)
    i := 0
    for i = (length - 1 - 1) / 2; i >= 0; i-- {
        adjust(arr, i, length-1)
    }

    for i = 0; i < length-1; i++ {
        tmp = arr[0]
        arr[0] = arr[length-1-i]
        arr[length-1-i] = tmp

        adjust(arr, 0, length-1-i-1)
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值