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;
}



相关文章
|
2天前
|
存储 C++ 容器
C++:STL - set & map
C++:STL - set & map
11 4
|
2天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
10 0
|
4天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
9 0
|
4天前
|
存储 Serverless C++
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
【C++入门到精通】哈希 (STL) _ unordered_map _ unordered_set [ C++入门 ]
8 1
|
5天前
|
存储 设计模式 算法
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
【C++/STL】stack和queue(容器适配器、优先队列、双端队列)
11 1
|
5天前
|
存储 编译器 C++
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
5 0
|
5天前
|
算法 C++ 容器
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
【C++/STL】vector(常见接口、模拟实现、迭代器失效)
10 0
|
11天前
|
存储 算法 C++
详解C++中的STL(标准模板库)容器
【4月更文挑战第30天】C++ STL容器包括序列容器(如`vector`、`list`、`deque`、`forward_list`、`array`和`string`)、关联容器(如`set`、`multiset`、`map`和`multimap`)和容器适配器(如`stack`、`queue`和`priority_queue`)。它们为动态数组、链表、栈、队列、集合和映射等数据结构提供了高效实现。选择合适的容器类型可优化性能,满足不同编程需求。
|
17天前
|
存储 缓存 算法
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
C++从入门到精通:4.6性能优化——深入理解算法与内存优化
|
17天前
|
存储 算法 程序员
C++从入门到精通:2.2.1标准库与STL容器算法深度解析
C++从入门到精通:2.2.1标准库与STL容器算法深度解析