首页 > 其他分享 >堆结构

堆结构

时间:2024-12-08 13:10:20浏览次数:7  
标签:index cur int maxIndex left 结构 size

[Algo] 堆结构

1. 经典堆结构

// 1. 经典堆结构(大根堆)
void heapInsert(vector<int> &v, int size, int val)
{
    v[size] = val;
    int cur = size;
    while (v[cur] > v[(cur - 1) / 2]) { swap(v[cur], v[(cur - 1) / 2]); cur = (cur - 1) / 2; }
}
void heapify(vector<int> &v, int size, int index)
{
    int left = 2 * index + 1;
    while (left < size)
    {
        int right = left + 1, maxIndex;
        if (right >= size || v[left] >= v[right]) maxIndex = left;
        else maxIndex = right;
        if (v[index] >= v[maxIndex]) return;
        swap(v[index], v[maxIndex]);
        index = maxIndex;
        left = 2 * index + 1;
    }
}

2. 堆排序

// 2. 堆排序
void heapSort(vector<int> &v)
{
    if (v.size() == 0) return;
    // 从顶至底建堆 O(n*log n)
    for (int i = 0; i < v.size(); i++) heapInsert(v, i, v[i]);
    // 也可以从底至顶建堆 O(n)
    // for (int i = v.size() - 1; i >= 0; i--) heapify(v, v.size(), i);
    int size = v.size();
    while (size > 1)
    {
        swap(v[0], v[--size]);
        heapify(v, size, 0);
    }
}

3. 线段重合问题

// 3. 线段重合问题
int maxSegOverlap(vector<pair<int, int>> &v)
{
    sort(v.begin(), v.end(), [](pair<int, int> p1, pair<int, int> p2){ return p1.first < p2.first; });
    priority_queue<int, vector<int>, greater<int>> heap;
    int ans = 0;
    for (int i = 0; i < v.size(); i++)
    {
        while (!heap.empty() && heap.top() <= v[i].first) heap.pop();
        heap.push(v[i].second);
        ans = heap.size() > ans ? heap.size() : ans;
    }
    return ans;
}

标签:index,cur,int,maxIndex,left,结构,size
From: https://www.cnblogs.com/yaoguyuan/p/18593292

相关文章

  • 大功率台式机CPU一体式混合冷却散热器结构热设计仿真分析案例实操与理论计算
     ......
  • 产品热设计结构模型预处理思路与solidworks处理方法
     ......
  • struct结构体项目1
    //三个教室//每个教室5个学生//每个学生包含姓名年龄成绩//1.求一个教室内学生总成绩//2.输出一个教室所有学生信息//3.输出一个教室根据学生成绩排序后的所有信息#include<iostream>usingnamespacestd;structStudent{ stringstu_name; intstu_age; double......
  • 写一个单向链数据结构的 js 实现并标注复杂度
    classNode{constructor(data){this.data=data;this.next=null;}}classLinkedList{constructor(){this.head=null;this.size=0;//Keeptrackofthelistsize}//Addanewnodetotheendofthelist(append)......
  • 结构体的使用 for循环使用方式
     1.创建结构体成员变量多个成员函数多个其他结构体多个2.定义结构体变量结构体名变量名3.调用  .成员访问符  for循环:for(1.初始条件;2.循环条件3.条件改变){4.表达式}while:1while(2){43}  sort......
  • 【数据结构】哈夫曼树
    哈夫曼树路径长度:从树中一个结点到另一个结点之间的分支构成这两个节点之间的路径,路径上的分支数目称为路径长度树的带权路径长度:树中所有叶子结点的带权路径长度之和,通常记为WPL=∑......
  • 数据结构 (31)插入类排序
    前言     数据结构中的插入类排序是一种简单直观的排序算法,其核心思想是通过构建有序序列,将未排序的数据逐个插入到已排序的序列中,直到所有元素都排序完毕。一、基本思想    插入排序的基本思想是将数组分为已排序和未排序两部分,初始时,已排序部分只包含一......
  • 数据结构 (32)交换类排序
    前言     交换排序是一类基于比较和交换元素位置的排序算法。其核心思想是通过两两比较待排元素的关键字(或称为key值),若发现与排序要求相逆(即逆序),则交换这两个元素的位置,直到所有元素都排序完毕。一、冒泡排序(BubbleSort)基本思想:通过反复比较相邻的元素,根据......
  • 构建 Home Assistant 自定义组件(第一部分):项目结构与基础
    构建HomeAssistant自定义组件(第一部分):项目结构与基础项目结构引言本系列博客文章将是一个创建HomeAssistant自定义组件的教程。我们将从一个基础组件开始,并在每篇文章中对其进行扩展。在教程结束时,你将拥有一个功能完备的组件,在集成质量量表上至少应获得银牌分数。......
  • 数据结构小白一小时手搓环形缓冲区
    什么是环形缓冲区环形缓冲区是一种非常高效且常用的数据结构,特别适用于需要处理数据流的场景。它通过循环利用固定大小的内存空间来实现数据的缓存和传输,避免了频繁的内存分配和释放,提高了系统性能和实时性。理解其工作原理和优缺点,可以帮助开发者更好地选择和使用这种数据......