最清晰十大排序之堆排序

本文详细介绍了堆排序算法,包括其核心思想——通过建立大根堆并调整元素来实现排序,涉及堆ify函数、大根堆构建和堆排序过程。空间复杂度为O(1),时间复杂度为O(nlogn)。通过实例演示了如何在Python中实现堆排序。
摘要由CSDN通过智能技术生成

堆排序的思想是调整和交换

基本思想:首先是建立大根堆,在大根堆的情况下,打乱一个元素,可以对其做调整恢复大根堆的性质。

1.建立大根堆:从底向上开始调整,符合调整的条件,从非叶子节点开始调整,因为需要交换节点与子节点,若没有子节点,则该节点不需要进行调整,若节点数目为n,则可以从(n-2)//2开始。

2.调整:调整这个函数有两个作用,第一,建立大根堆;第二,在大根堆的基础上交换堆顶和堆底元素,并对剩余元素继续做调整和交换。

空间复杂度:O(1)  (没有额外辅助空间,在原地进行交换)

时间复杂度: O(nlogn)  (在遍历数组的循环下,进行堆调整,调整的过程是logn,可以理解为树的深度)

#调整大根堆
def heapify(arr, n, i):
    #参数为要调整的数组arr,数组中元素的个数n, 需要调整的元素i
    #调整的条件是只递归调整交换过位置的节点,其他子节点保持不动,说明调整条件,要保证子树符合大根        
    #堆的性质

    left = 2 * i + 1
    right = left + 1
    larger = i


    if left < n and arr[left] > arr[larger]:
        larger = left

    if right < n and arr[right] > arr[larger]:
        larger = right

    if larger != i:
        arr[larger], arr[i] = arr[i], arr[larger]
        #递归调整调换过后位置元素的子树的大根堆调整
        heapify(arr, n, larger)


#建立大根堆
def build_max_heap(arr):
    #从底向上,非叶子节点开始调整,保证后续调整的条件
    n = len(arr)
    for i in range((n-2)//2, -1, -1):
        heapify(arr, n, i)


#堆排序,每次取一个和堆顶元素交换,然后对剩余的元素继续进行堆调整直至没有剩余元素
def heap_sort(arr):
    #建立大顶堆
    build_max_heap(arr)

    n = len(arr)
    #将堆顶元素和最底部元素做交换,然后对剩余元素重复此操作
    for i in range(n-1, -1, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)


arr = [21, 1, 4, 23, 8, 45, 10]
heap_sort(arr)
print(arr)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

资料加载中

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

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

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

打赏作者

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

抵扣说明:

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

余额充值