Heapsort (python)

The code is as follows. Combined with the video of station b and the content of chapter 9.7 of "Dahua Data Structure", I finally understand it. The code is relatively concise and easy to understand.

# -*- ecoding: utf-8 -*-
# @ModuleName: 
# @Function: 
# @Author: Zz
# @Time: 2022/3/22 10:34
def sort(array):
    # 遍历非叶子结点,简历堆结构数组
    for i in range((int(len(array) / 2))-1, -1, -1):
        adjustHeap(array, i, len(array))

    print('arr of heop:', array)
    # 堆积树建立完成,开始排序。
    for j in range(len(array) - 1, 0, -1):
        # 一开始最大元素是[0],然后被换到最后一个
        # 从n-0,不断和[0]元素交换,重新堆排序(即把2、3、...、n大的翻转到最上面)
        array[0], array[j] = array[j], array[0]
        adjustHeap(array, 0, j)

def adjustHeap(array, i, length):
    # 对第i号进行堆调整
    # 获取非叶子结点的数据
    temp = array[i]
    # 非叶子结点的左子节点
    k = 2*i + 1
    # 遍历对比k后面的结点,把temp放入合理位置
    while k < length:
        # k + 1 < length 确保左右结点才有比较
        if k + 1 < length and array[k] < array[k + 1]: # 如果左子结点比右子结点小,k就切换到右子结点
            k += 1
        # 如果子结点有更大的
        if array[k] > temp:
            # 父节点替换为更大的
            array[i] = array[k]
            # 记录当前最大点位置
            i = k
        else: # 直接打断,因为堆特点, 后面的层更不满足
            break
        # k切换到下一个左子结点
        k = 2*k + 1
    # 此时i是空位,i上层的都比temp大,temp放到这里
    # 将结点元素的值赋予更大子结点
    array[i] = temp
if __name__ == '__main__':
    data = [3, 2, 4, 1, 5]
    print('arr', data)
    print('start max heap sort')
    sort(data)
    print('arr sorted:', data)

Reference link: https://www.bilibili.com/video/BV1qA411i7pb?spm_id_from=333.337.search-card.all.click

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324326899&siteId=291194637