堆排序详解

在这里插入图片描述

    void maxHeapify(vector<int>& a, int i, int heapSize) {*该函数的作用是使得以i节点为根得堆变为最大堆*
        int l = i * 2 + 1, r = i * 2 + 2, largest = i;*i是根节点,l是左叶子节点,r是右叶子节点*
        if (l < heapSize && a[l] > a[largest]) {
            largest = l;
        } 
        if (r < heapSize && a[r] > a[largest]) {
            largest = r;
        }*将根,左右孩子最大的元素的下标赋值给largest变量
        if (largest != i) {*递归的终止条件为largest == i*
            swap(a[i], a[largest]);*交换三个节点中最大的值到当前根节点i中*
            maxHeapify(a, largest, heapSize);*递归执行,将与三个节点中最大交换后的节点找到他的合适的位置,使得局部变为大根堆。*
        }
    }

    void buildMaxHeap(vector<int>& a, int heapSize) {
        for (int i = heapSize / 2; i >= 0; --i) {*heapsize/2整除,直接找到堆的最小的不是叶子节点的节点,这样一来最先就是从堆的底端开始。这一点很重要,是自底向上的构建大根堆*
            maxHeapify(a, i, heapSize);*调用局部大根堆函数*
        } 
    }

  heap = [1,3,4,2,6,8,9]
  heapq.heappop(heap) 
  # heap = [3,2,4,9,6,8] #删除堆顶后将堆尾放到堆顶,然后下沉,只是被交换节点下沉,这里是根节点(执行void minHeapify)

from heapq import heappop, heappush
heap = [1,3,4,2,6,8,9]
heappush(heap, 0)
#[0, 1, 4, 3, 6, 8, 9, 2]#j将新插入的元素在当前堆中找到它的位置
heapq.heapify(nums)#将列表转换为小根堆

不论是插入还是删除后的处理,本质都是一样的,都是找到某一个节点在当前堆的位置,用的就是maxHeapify函数的原理,注意该函数中largest表示永远都是一开始节点的那个值(这是精髓)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值