堆排序——python

本文详细介绍了堆排序算法的原理与实现,包括最大堆的构建、维护最大堆性质的方法以及如何通过堆排序实现数组的升序排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序:

        数据结构——堆,具有如下性质:

        parent(i):   math.floor(i/2)

        left(i):         2*i

        right(i):       2*i+1

        堆可分为,最大堆(A[ parent(i) ] >= A[ i ])和最小堆(A[ parent(i) ] <= A[ i ])。一般最大堆用于排序算法,最小堆用于优先队列。

heapSort算法实现:

        Max_heapify : 维护最大堆的性质。

        Build_Max_heap :  构造最大堆。

        把数组转换为最大堆,我们可以认为叶子节点是包含一个元素的堆,因此只需对其他非叶子节点调用Max_heapify

        heapSort : 堆排序(原址)。

        首先将数组转化为最大堆,数组中最大值必然为最大堆的堆顶,因此只需A[1]和A[n]对调然后调用Max_heapify,重复这个过程就可实现原址排序。

def buildMaxHeap(arr):
    import math
    for i in range(math.floor(len(arr)/2),-1,-1):
        heapify(arr,i)

def heapify(arr, i):
    left = 2*i+1
    right = 2*i+2
    largest = i
    if left < arrLen and arr[left] > arr[largest]:
        largest = left
    if right < arrLen and arr[right] > arr[largest]:
        largest = right

    if largest != i:
        swap(arr, i, largest)
        heapify(arr, largest)

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]

def heapSort(arr):
    global arrLen
    arrLen = len(arr)
    buildMaxHeap(arr)
    for i in range(len(arr)-1,0,-1):
        swap(arr,0,i)
        arrLen -=1
        heapify(arr, 0)
    return arr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值