C++STL算法之堆算法

简介: C++STL算法之堆算法

堆就是如图,像这样一种连续的数据,但是注意0的位置不存储数据,目的是为了让编号一置

这里介绍两个概念

大顶堆: 一段内存在二叉数的基础上有序(父节点大于子节点)

小顶堆:与顶堆相反

堆算法函数

make_heap 创建一个堆(默认形式大顶堆)

push_heap

入堆(不是传的数据,只是每一次调用,让你变成堆的形式),起到一个调整数据位置的作用

pop_heap 出堆,也只是一个调整数据,将数据放到堆后面

sort_heap堆排序

注意:真正意义上的,插入数据和删除数据,还是要根据相应的容器调用其中的函数(比如:push_back,pop_back)

堆算法函数的使用

make_heap

有三个参数,前2个参数表示迭代器的范围,最后一个参数写比较准则

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 9, 7, 9 };
  make_heap(v1.begin(), v1.end());//默认形式是大顶堆
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  make_heap(v1.begin(), v1.end(), less<int>()); //大顶堆
  copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
  cout << endl;
  make_heap(v1.begin(), v1.end(), greater<int>());  //小顶堆
  copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "));
  return 0;
}

push_heap

在插入数据的时候,调用这个函数,将其变为堆的形式

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 9, 7, 9 };
  make_heap(v1.begin(), v1.end());//默认形式是大顶堆
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  v1.push_back(8);
  v1.push_back(4);
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  push_heap(v1.begin(), v1.end());
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  return 0;
}

pop_heap

出堆的时候,先调用这个函数,将第一个元素,放到最后面,然后用尾删法,删除数据

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 9, 7, 9 };
  make_heap(v1.begin(), v1.end());//默认形式是大顶堆
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  pop_heap(v1.begin(), v1.end());  //堆的删除
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  v1.pop_back();
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  make_heap(v1.begin(), v1.end());
  cout << endl;
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  return 0;
}

sort_heap

这个排序默认,也就是简单的从小到大排序,当然第三个参数,你应该也可以写比较准则

#include<iostream>
#include<functional>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
  vector<int> v1 = { 1, 2, 9, 7, 9 };
  make_heap(v1.begin(), v1.end());//默认形式是大顶堆
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  cout << endl;
  sort_heap(v1.begin(), v1.end());
  for_each(v1.begin(), v1.end(), [](int& date) {cout << date << " "; });
  return 0;
}



相关文章
|
29天前
|
算法 C++ 容器
C++标准库中copy算法的使用
C++标准库中copy算法的使用
14 1
|
14天前
|
存储 算法 编译器
[C++] STL简介
[C++] STL简介
11 1
|
21天前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
30 2
|
14天前
|
数据采集 算法
基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真
该程序利用PSO算法优化5个4*20矩阵中的模块采集轨迹,确保采集的物品数量及元素含量符合要求。在MATLAB2022a上运行,通过迭代寻优,选择最佳模块组合并优化轨道,使采集效率、路径长度及时间等综合指标最优。具体算法实现了粒子状态更新、需求量差值评估及轨迹优化等功能,最终输出最优轨迹及其相关性能指标。
|
22天前
|
算法 搜索推荐 C++
c++常见算法
C++中几种常见算法的示例代码,包括查找数组中的最大值、数组倒置以及冒泡排序算法。
14 0
|
27天前
|
安全 编译器 容器
C++STL容器和智能指针
C++STL容器和智能指针
|
29天前
|
算法 C++ 容器
【C++算法】双指针
【C++算法】双指针
|
29天前
|
算法 安全 Linux
|
2月前
|
设计模式 算法 Java
【c++】STL之stack和queue详解
【c++】STL之stack和queue详解
31 1
|
2月前
|
算法 Java 开发者
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
Java面试题:Java内存探秘与多线程并发实战,Java内存模型及分区:理解Java堆、栈、方法区等内存区域的作用,垃圾收集机制:掌握常见的垃圾收集算法及其优缺点
26 0