python实现堆排序

堆排序

概念:

二叉堆,二叉堆本质上是一种完全二叉树,可以分为最大堆和最小堆两种。最大堆:任何一个父节点的值都大于等于其子节点的值;最小堆:任何一个父节点的值都小于等于其子节点的值。
二叉堆的根节点叫堆顶,二叉堆的特点决定了最大堆的堆顶是整个堆数据中的最大值,最小堆的堆顶是整个堆数据中的最小值。

堆的自我调整:

插入节点:首先将节点插入到堆尾,然后判断新插入的节点与其父节点是否满足最大/小堆的概念,若不满足,则将节点上移,然后再检查是否满足条件,直至整个二叉堆均满足条件。
删除节点:
例如删除最小堆的堆顶,即删除堆数据中最小的数字,首先将堆顶1和堆尾10交换位置,然后删除新的堆尾1,并对堆顶10做向下调整,直至形成新的堆。10在做向下调整时应从左右子树中选取值最小的
在这里插入图片描述

构建二叉堆:

即将一颗无序的二叉树调整为最大/最小堆,下面主要介绍自下而上的构建二叉堆:本质上是让所有非叶子节点依次下沉。
在这里插入图片描述

堆的存储:

二叉堆在存储时,采用顺序存储的方式,对于节点n,其左右子节点为2n+1/2n+2,其父节点为(n-1)/2并向下取整。
在这里插入图片描述

堆排序:

首先构建最大/小堆,然后将堆顶元素移动到堆尾,并从最大/小堆中取出此数据,然后经过调整第二大/小的元素就会成为新的堆顶,不断重复此过程,堆中的数据会按顺序依次取出。
在这里插入图片描述

python代码实现堆排序:
#堆排序
def heap_sort(nums):
    build_heap(nums)
    for i in range(len(nums)-1,-1,-1):
        nums[0], nums[i] = nums[i], nums[0]
        max_heapify(nums, 0, i)

#构建堆
def build_heap(nums):
    lenght = len(nums)
    for i in range((lenght-1)//2,-1,-1):
        max_heapify(nums, i, lenght)

#将堆的节点向上调整
def max_heapify(nums, i, lenght):#i父节点的位置,length数组长度
    #找到节点的左右孩子节点
    left = i*2+1
    right = i*2+2
    #判断左右孩子节点与父节点的大小
    if left < lenght and nums[left] > nums[i]:
        largest = left
    else:
        largest = i
    if right < lenght and nums[right] > nums[largest]:
        largest = right
    if largest != i:
        nums[i], nums[largest] = nums[largest], nums[i]
        #调整子树
        max_heapify(nums, largest, lenght)

nums = [7,0,0,2,4,3]
if __name__ == "__main__":
    heap_sort(nums)
    print(nums)

#输出[0, 0, 2, 3, 4, 7]

堆排序的时间复杂度为O(nlog(n))。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值