数据结构_02

堆排序

堆排序的思想是将数据以二叉树的方式进行排列放置,其实重点在于将每次都将当前的结点与孩子结点进行对比,如果孩子结点大于双亲结点则,将这个孩子结点替代这个双亲结点,以总结点数//2=n,n,n-1,n-2,n-3,…1,,注意如果替换了之后,还有孩子结点还要继续替换。直接看代码:

def heap_sort(a):
    a = [0] + a
    b = a
    for i in range(len(a), 1, -1):
        a = heap_adjust(a[0:i])
        a[1], a[len(a) - 1] = a[len(a) - 1], a[1]
        b[i - 1] = a[-1]
    return b[1:len(b) + 1]
    
def heap_adjust(a):
    num = len(a) - 1
    num_half = num // 2
    for i in range(num_half, 0, -1):
        temp = heap_change(a, i)
        while temp * 2 < num:
            temp = heap_change(a, temp)
    return adef heap_change(a, i):
    if 2 * i + 1 > len(a) - 1:
        if a[2 * i] > a[i]:
            a[i], a[2 * i] = a[2 * i], a[i]
            return len(a) - 1
        else:
            return 2 * i
    else:
        if a[2 * i + 1] > a[i] or a[2 * i] > a[i]:
            if a[2 * i + 1] > a[2 * i]:
                a[i], a[2 * i + 1] = a[2 * i + 1], a[i]
                return 2 * i + 1
            else:
                a[i], a[2 * i] = a[2 * i], a[i]
                return 2 * i
        else:
            return len(a) - 1
            
a = [5, 1, 9, 3, 73, 24, 32, 88, 0, 22, 64, 4, 4, 8, 54, 0, 6, 2]
print("排序前", a)
a = heap_sort(a)
print("排序后", a)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值