堆排序

1. 堆结构

大顶堆:每个结点的值都大于或等于其左右孩子结点的值,在堆排序算法中用于升序排列;

小顶堆:每个结点的值都小于或等于其左右孩子结点的值,在堆排序算法中用于降序排列

2. 堆排序

概念:利用堆的概念来排序的选择排序
平均复杂度:O(nlogn) 不稳定的算法
算法步骤:

  1. 创建一个堆 H[0……n-1];
  2. 把堆首(最大值)和堆尾互换;
  3. 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
  4. 重复步骤 2,直到堆的尺寸为 1

3. 代码实现

import math


def buildMaxHeap(arr):
    for i in range(math.floor(len(arr) / 2), -1, -1):  # 从中间位置到初始位置
        heapify(arr, i)


def heapify(arr, i):
    left = 2 * i + 1  # 左孩子位置
    right = 2 * i + 2  # 右孩子位置
    largest = i  # 记录当前最大值(最小值)默认根部
    if left < arrLen and arr[left] > arr[largest]:
        largest = left  # 左孩子大于根记录位置

    if right < arrLen and arr[right] > arr[largest]:
        largest = right  # 右孩子大于根记录位置

    if largest != i:
        swap(arr, i, largest)  # 交换
        heapify(arr, largest)  # 递归


def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]


def heapSort(arr):
    global arrLen
    arrLen = len(arr)
    buildMaxHeap(arr)  # 构造完最大堆(最小堆)
    for i in range(len(arr) - 1, 0, -1):  #
        swap(arr, 0, i)  # 将最大值放到最后
        arrLen -= 1  # 长度减一
        heapify(arr, 0)  # 重新构造堆
    return arr 


if __name__ == '__main__':
    arr = [1, 5, 2, 10, 4, 9, 3, 7, 6, 0]
    print(heapSort(arr))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值