C++ greater/less 和建堆

article/2025/9/23 3:23:49

文章目录

  • STL中的greater<>()和less<>()
  • Heap
    • 定义
    • 堆排序
      • 构建堆
      • 堆排序
    • C++的STL中堆的实现

STL中的greater<>()和less<>()

两个函数的头文件为
排序的时候,默认是从小到大;从大到小排序要使第三个参数为greater()。
建堆的时候,默认是最大堆;最小堆要使第三个参数为greater()。
make_heap等heap操作函数在头文件里## 测试用例

// 排序
#include<iostream>
#include<algorithm>
#include<functional>using namespace std;void print(int intNums[], int nLength)
{//  依次输出数组元素for (int i = 0; i < nLength; i++){cout << intNums[i] << " ";}cout << endl;
}int main()
{int intNums[] = {5, 2, 7, 4, 1, 8, 3, 6, 9};int nLength = sizeof(intNums) / sizeof(int);sort(intNums, intNums+nLength, greater<int>()); // 按从大到小排序print(intNums, nLength);sort(intNums, intNums+nLength, less<int>()); // 按从小到大排序print(intNums, nLength);
}

在这里插入图片描述

Heap

定义

堆是一个完全二叉树,可以用一维数组来存储所有结点,堆分大顶堆和小顶堆。
大顶堆(最大堆):每个结点的值都大于或等于其左右孩子结点的值。
小顶堆(最小堆):每个结点的值都小于或等于其左右孩子结点的值。

若一维数组从下标为0处开始存储:arr[i]的左孩子为arr[2i+1], arr[i]的右孩子为arr[2i+2]。(i>=0)(对于大顶堆有 arr[i] >= arr[2i+1] 以及 arr[i] >= arr[2i+2] )
若一维数组从下标为1处开始存储,下标为0处可以存储元素总个数:arr[i]的左孩子为arr[2i],arr[i]的右孩子为arr[2i+1]。(i>0)

总结一下: 堆是满足堆的属性的完全二叉树(结点为最值,不需要整棵树有序),以一维数组的形式存储,目的是以最快的速度找到最值。(二叉搜索树中搜索会很快,但堆中搜索会很慢)
在这里插入图片描述
在这里插入图片描述

堆排序

以最大堆为例,堆顶元素是最大值,我们将堆顶元素与最后一个元素交换,然后将剩下的元素调整成最大堆;循环以上步骤,最终数组中的元素将按升序排序。

构建堆

给定数组int nums[]={3,7,4,9,5}
在这里插入图片描述
依次从下到上,从右到左调整为最大堆。
按以上顺序依次扫描非叶子结点,若该结点值小于其左/右子树的值,则将该结点与左右子树中最大值的结点进行交换。
最后一个非叶子结点为: length/2-1,再找下一个非叶子结点只要减1就好了,直到找到堆顶元素。
这里最后一个非叶子结点为nums[5/2-1],即nums[1]==7, 其孩子最大值为9,将7和9交换。
在这里插入图片描述
下一个非叶子结点为nums[1-1],即nums[0]==3。其孩子最大值为9,将3与9交换。在这里插入图片描述
下一步,检查调整后的子树是否满足最大堆的性质,由于只将根结点的值与左子树互换,只需检查左子树是否满足最大堆的性质。若不满足,则按以上步骤,从最后一个非叶子结点依次调整。(可以看到这是一个递归的过程)
在这里插入图片描述
最大堆构建完毕!

堆排序

将堆顶元素与最后一个元素互换,将剩余元素调整为最大堆。
在这里插入图片描述
循环。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
排序结束,此时数组中的元素为{3,4,5,7,9},按升序排序。

C++的STL中堆的实现

// 初始化堆
vector<int> arr = {3, 4, 7, 9, 2, 5, 8, 1, 6};
make_heap(arr.begin(), arr.end(), less<int>()); // 建立最大堆, O(n)
// make_heap(arr.begin(), arr.end(), greater<int>()); // 建立最小堆// 判断堆
is_heap(arr.begin(), arr.end()); // 插入元素
// 在堆中插入元素每次都是将新数据放在数组最后,然后调整到合适位置。
arr.push_back(20); // 先将元素插入vector中
push_heap(arr.begin(), arr.end()); // 调用 push_heap 调整堆,O(logn)
// 在使用push_heap之前要先建堆,因为push_heap只是将指定区间的最后一个元素插入heap中// 删除元素
// 堆的删除操作只能删除堆顶元素, 实际操作是将最后一个元素赋值给栈顶元素,然后从栈顶自上而下调整堆
pop_heap(arr.begin(), arr.end(), less<T>());  // 弹出heap顶元素,将其放置于区间末尾,O(logn)
arr.pop_back();// 堆排序后不是一个真正的堆了
// 每次取出堆顶元素,即排序结果,通过反复调用pop_heap来实现O(nlogn)
sort_heap(arr.begin(), arr.end()); // 容器中的元素按从小到大排序

参考资料:
[1] C++ Heap 堆
[2] C++标准库中的堆-heap
[3] heap c++ 操作 大顶堆、小顶堆
[4] 堆排序C++实现(三个函数,建堆、调整成堆、堆排序)


http://chatgpt.dhexx.cn/article/NtniUYnJ.shtml

相关文章

Greater and Greater

题目 传送门 题目大意 给定大小为n的序列A和大小为m的序列B&#xff0c;计算A中所有大小为m的子区间S&#xff0c;满足 分析 本题使用了一个special的STL&#xff1a;bitset 考虑bitset&#xff0c;对每个A求一个长为m的bitset Si&#xff0c;其中Si[j]1当且仅当Ai≥Bj。…

Error: Microsoft Visual C++ 14.0 or greater is required 解决方法

在Windows上安装某些Python依赖包时经常会遇到如下错误&#xff0c;其原因是&#xff1a;安装包&#xff08;此处是box2d-py&#xff09;没有找到Microsoft Visual C 14.0或更高版本的运行环境&#xff0c;所以无法正常启动。 error: subprocess-exited-with-error....Running…

什么是MVP模式?

MVP&#xff08;Model-View-Presenter&#xff09;是MVC模式的改良&#xff0c;由IBM的子公司Taligent提出。 和MVC的相同之处在于&#xff1a;Controller/Presenter负责业务逻辑&#xff0c;Model管理数据&#xff0c;View负责显示。 1.各部分之间的通信,都是双向的. View &l…

理解MVP设计模式

版权声明&#xff1a;转载请注明本文出自远古大钟的博客&#xff08;http://blog.csdn.net/duo2005duo&#xff09;&#xff0c;谢谢支持&#xff01; 目录(?)[] 转载请注明本文出自远古大钟的博客&#xff08;http://blog.csdn.net/duo2005duo&#xff09;&#xff0c;谢谢支…

iOS-MVP模式

前言 最近一段时间&#xff0c;公司刚做完一个MVP项目&#xff0c;我有一个习惯&#xff1a;在项目结项之后总结一下项目中新接触的问题。Google一下关键字“iOS MVP”&#xff0c;发现一些文章&#xff0c;最后是 这篇文章 带给我对MVP 的一些认识。MVP似乎有好多的变种&#…

Android:安卓学习笔记之MVP模式的简单理解和使用

Android MVP模式的简单理解和使用 MVP模式1、 为什么使用MVP模式&#xff1f;1.1、实例说明 2、一步步让你理解MVP2.1、MVP实现第一步&#xff0c; 将页面拆分为M/V/P三个模块2.2、 MVP实现第2步&#xff0c; 使用接口通信&#xff0c;进一步解耦2.2.1、MVP遵从的面向对象原则 …

MVP开发模式解析

前言 由于项目里同事用到MVP开发模式&#xff0c;我看了几篇关于 MVP 的文章&#xff0c;对其有了基本的了解之后&#xff0c;便照猫画虎进行了开发&#xff0c;之后便再也没接触过 MVP。 最近空闲读了些MVP的文章&#xff0c;受益匪浅&#xff0c;于是打算写一篇关于MVP开发…

MVP模式的优缺点

MVP模式是MVC的一个演化版本&#xff0c;全称是Model view Presenter。 MVP能够有效的降低View的复杂性&#xff0c;避免业务逻辑被塞进View中,使得View变成一个混乱的“大泥坑”。 MVP模式会解除View与Model的耦合&#xff0c;同时又带来了良好的可扩展性&#xff0c;可测试…

Android MVP开发模式 google 官方Mvp架构详解(转)

Google官方MVP Sample代码解读 关于Android程序的构架, 当前最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法.Repo地址: android-architecture.本文为阅读官方sample代码的阅读笔记和分析. 官方Android Architecture Blueprints [beta]:Android在如…

MVP模式的相关知识

MVP 是从经典的模式MVC演变而来&#xff0c;它们的基本思想有相通的地方&#xff1a;Controller/Presenter负责逻辑的处理&#xff0c;Model提供数据&#xff0c;View负责显示。作为一种新的模式&#xff0c;MVP与MVC有着一个重大的区别&#xff1a;在MVP中View并不直接使用Mod…

【iOS】MVP模式

文章目录 什么是MVP模式&#xff1f;图解 从MVC到MVP苹果的MVC为何要从MVC到MVP?MVP MVP模式下的工程MVP模式的优缺点 什么是MVP模式&#xff1f; MVP模式是MVC模式的一个演化版本&#xff0c;MVP全称Model-View-Presenter。&#xff08;关于MVC模式可见这篇文章&#xff09; …

浅谈安卓中的MVP模式

端午放假&#xff0c;天气下雨&#xff0c;于是乎在家撸一下博客&#xff0c;本篇博客将为大家解析MVP模式在安卓中的应用。 本文将从以下几个方面对MVP模式进行讲解&#xff1a; 1. MVP简介 2. 为什么使用MVP模式 3. MVP模式实例 4. MVP中的内存泄露问题 1. MVP简介&…

Android MVP模式 入门

1.前言 近些年来&#xff0c;Android架构模式有很多&#xff0c;我们比较熟知的有MVC&#xff0c;MVP以及MVVM&#xff0c;目前Android市场中使用最多的应该是MVP架构&#xff0c;虽然MVVM结合DataBing看似更加方便&#xff0c;但在一般公司中使用的还是比较少。其实模式这种东…

MVP模式实例解释

为什么在UI层包含太多的逻辑是很糟糕的&#xff1f;在既不手动运行应用程序&#xff0c;也不维护丑陋的自动执行UI组件的UI运行者脚本(runner script)的情况下&#xff0c;位于应用程序UI层中的代码是非常难于调试的。虽然这本身就是一个很大的问题&#xff0c;一个更大的问题是…

Android开发之MVP模式

前言&#xff1a;在之前的开发中一直用的是mvc模式搭建的项目&#xff0c;所以我对于mvp也一直只是停留在理论和demo阶段上。正好现在的项目是被小伙伴借助dragger搭建的mvp模式的结构&#xff0c;所以就想着总结整理一下mvp模式的东西并写出来&#xff0c;也算是作为自己使用了…

MVP模式与MVC模式

源地址&#xff1a;http://www.cnblogs.com/cuihongyu3503319/archive/2009/01/09/1372820.html MVP模式与MVC模式(转) MVP 是从经典的模式MVC演变而来&#xff0c;它们的基本思想有相通的地方&#xff1a;Controller/Presenter负责逻辑的处理&#xff0c;Model提供数据&#x…

MVP模式从入门到精通

首先附上自己写的一个MVP的demo&#xff0c;这是一个很标准的MVP&#xff0c;Github地址如下&#xff1a; https://github.com/SilasGao/MVPDemo 首先MVP 是从经典的MVC架构演变而来&#xff0c;那我们是不是要先说下何为MVC模式&#xff1f; 系统C/S(Client/Server)三层架构模…

MVP模式使用示例详解

什么是MVP模式? 这个MVP可不是腾讯游戏《王者荣耀》中的MVP。我们今天要讨论的MVP其实同MVC一样&#xff0c;是一种编程模式和思想&#xff0c;也许更准确地讲是一种架构。 MVP和MVC的区别 提到MVP模式&#xff0c;大家自然避免不了要和我们以前常用的MVC模式进行对…

MVP设计模式

Model–view–presenter (MVP) 是model–view–controller (MVC)设计模式派生出来的。MVP经常用来创建用户界面。 presenter是作为一个“中间人”的角色存在。在MVP中&#xff0c;所有页面显示逻辑都会被推送到presenter。 以下这张图是MVC模式的&#xff1a; MVP与MVC有着一…

Android中用到的MVP模式

参考&#xff1a;android架构设计—mvp模式封装 很简单&#xff0c;M&#xff1a;数据&#xff0c; V:界面&#xff0c; P:一个使唤数据(M)和界面(V)干活的大管家。 特点&#xff1a;在P的管理下&#xff0c;P可以直接支配V和M做一些事情。但是V&#xff0c;与M&#xff0c;你…