python实现堆排序

一:原理

        要理解堆排序,首先要了解堆的知识。然后根据堆进行排序。

(1)堆:

        堆是基于完全二叉树的原理。完全二叉树:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

          

                由图解所示,每一个堆顶都满足大于它的左孩子和右孩子,此堆成为大顶堆。相反,每一个堆顶都满足小于它的左孩子和右孩子,此堆成为小顶堆。

小顶堆:                                                         大顶堆:

                                                                                                       

        堆中的数遵循从上到下,从左到右的顺序从开始对堆中的数进行编号。假设堆顶编号为i,则左子数列编号为 i*2 ,右子数列 i*2+1。

三:代码

#首先我们需要编写一个函数构造一个大顶堆
def maxHeapify(heap,start,end):
    son=start*2#定义son为左子序列
    while son <= end :
        if son+1 <= end and heap[son+1] > heap[son]:'''选取左子树根和右子树根中比较大的编号缓存到son中'''
            son+=1#获取son的子数列的下标并缓存到son中
        if heap[son] > heap[start]:
            heap[son],heap[start]=heap[start],heap[son]#交换大于父子序列的值,使之在堆顶的位置
            start,son=son,son*2#迭代到下一个子序列迭代到下面的数列
        else:
            break

def HeapSort(a):
    heap=[None]+a#因为堆的编号下标为1,所以用[None]来当做占位符,占位数组中下标为0的位置
    root=1#代表堆顶元素的编号
    l=len(heap)
    for i in range(l//2,root-1,-1):#自底向上地构造堆
        maxHeapify(heap,i,l-1)
    for i in range(l-1,root,-1):#因为此时堆底元素为最小元素,将堆底元素和堆顶元素进行交换
        heap[i],heap[root]=heap[root],heap[i]
        maxHeapify(heap,root,i-1)#交换后保持堆的合法性
    return heap[root:]

执行:
a=[1,8,2,6,7,3,4,9,5]
print(HeapSort(a))

结果:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

        

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晗14

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值