堆排序--python

通常堆是通过一维数组来实现的。在阵列起始位置为0的情况中
(1)父节点i的左子节点在位置(2i+1);
(2)父节点i的右子节点在位置(2
i+2);

# (1)最大堆调整(heapify):将堆的末端子节点作调整,使得子节点永远小于父节点。
# (2)建立最大堆(buildMaxHeap):将堆所有数据重新排序。建堆的过程其实就是不断做最大堆调整的过程,从len/2出开始调整,一直比到第一个节点。
# (3) 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算。堆排序是利用建堆和堆调整来进行的。首先先建堆,然后将堆的根节点选出与最后一个节点进行交换,然后将前面len-1个节点继续做堆调整的过程。直到将所有的节点取出,对于n个数我们只需要做n-1次操作。
def heapify(arr, arrLen,root):   # 在堆中做结构调整使得父节点root的值大于子节点
    left = 2*root + 1
    right = 2*root + 2
    # arrLen = len(arr)
    largest = root
    if left < arrLen and arr[left] > arr[largest]:
        largest = left
    if right < arrLen and arr[right] > arr[largest]:
        largest = right

    if largest != root:
        arr[root], arr[largest] = arr[largest], arr[root]
        heapify(arr, largest)
def buildMaxHeap(arr):   # 构造一个堆,将堆中所有数据重新排序
    for i in range((len(arr)//2),-1,-1):
        heapify(arr, len(arr), i)
 
def HeapSort(arr):  # 将根节点取出与最后一位做对调,对前面len-1个节点继续进行对调整过程。
    buildMAXHeap(arr)
    for i in range(len(arr)-1,-1,-1):
        arr[0],arr[i] = arr[i], arr[0]
        heapify(arr, i, 0)
    return arr



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值