堆排序回顾

本文介绍了如何使用堆排序解决力扣平台上的“数组中的第k个最大元素”问题,通过构建和维护大根堆,逐步提取最大元素的过程。作者详细展示了大根堆的结构和maxHeapify及buildMaxHeap函数的实现。
摘要由CSDN通过智能技术生成

在力扣“数组中的第k个最大元素”问题中,有用到堆排序的思想。这里回顾以下堆排序。

首先介绍以下大根堆的概念:

大根堆是一种特殊的二叉树,在大根堆中,每个节点的值都大于等于其子节点的值。在实际编程中也可以用数组存储大根堆,其中假设i位置是一个节点,那么它的左孩子节点位置为i*2+1,右孩子节点位置为i*2+2.即完全二叉树的性质。

堆排序的第一步是建立大根堆,然后将这个大根堆的根节点(最大值)与数组中最后一个元素交换位置,并将堆的大小减1(相当于取出原来的最大值根节点)。将剩下的堆继续进行大根堆创建。

这样每次创建大根堆都进行交换,直到结束后,原数组就是从小到大的顺序了。

代码如下:

#include<iostream>
#include<vector>

using namespace std;

void maxHeapify(vector<int>& a, int i, int heapSize) {
    int l = i * 2 + 1, r = i * 2 + 2, largest = i;
    if (l < heapSize && a[l] > a[largest]) {
        largest = l;
    } 
    if (r < heapSize && a[r] > a[largest]) {
        largest = r;
    }
    if (largest != i) {
        swap(a[i], a[largest]);
        maxHeapify(a, largest, heapSize);
    }
}

void buildMaxHeap(vector<int>& a, int heapSize) {
    for (int i = heapSize / 2; i >= 0; --i) {
        maxHeapify(a, i, heapSize);
    } 
}

int main(){
    vector<int> a={3,2,1,5,6,4,1,1,8};
    int heapSize=a.size();
    buildMaxHeap(a,heapSize);
    for(int i=a.size()-1;i>=0;i--){
        swap(a[0],a[i]);
        heapSize--;
        maxHeapify(a, 0, heapSize);
    }
    return 0;
}

在大根堆化的函数maxHeapify函数中,a是数组,i是根节点,heapSize是堆的大小。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值