四.c++中的算法--排序及相关操作---堆操作
来源:互联网 发布:关于网络的论文 编辑:程序博客网 时间:2024/05/21 22:37
4.堆操作
“堆”是一种组织序列元素的方式。堆的内部数据结构是二叉树。
两大性质:
1. 堆的第一个元素通常是最大的元素
2. 能够在对数时间内增加或移除一个元素;
堆的操作算法:
- push_heap()
- pop_heap()
- sort_heap()
- make_heap()
- 等等
1.make_heap()
函数模型:
template< class RandomIt >void make_heap( RandomIt first, RandomIt last );template< class RandomIt, class Compare >void make_heap( RandomIt first, RandomIt last, Compare comp );
说明:
1. 两个形式都可以将范围[first,last)内的元素构建成堆。
2. 第一个形式: 使用默认比较:operator<
3. 第二个形式: 使用的二元比较函数: comp
4. 无返回值
5. 使用堆处理的条件:元素要多余1个。如果只有一个元素,没必要使用堆,也可以认为单个元素就是“堆”。
例子:
----------省略-------------vector<int> vec1 = { 1, 2, 4, 5, 6, 3 };make_heap(vec1.begin(), vec1.end());
输出结果:
vec1: 1 2 4 5 6 3make_heap vec1: 6 5 4 1 2 3
第一个元素为最大的元素。
2.push_heap()
- 在指定区间内插入一个元素。新插入的元素放在堆栈的末尾,即尾指针
- 必须保证区间原有元素是一个“堆”
函数原型:
template< class RandomIt >void push_heap( RandomIt first, RandomIt last );template< class RandomIt, class Compare >void push_heap( RandomIt first, RandomIt last, Compare comp );
说明:
1. 插入元素到[first,last)的范围内部
2. 第一种形式: 使用默认规则operator<
3. 第二种形式: 使用自定义二元比较函数comp
3.pop_heap
作用是删除在[first,last)范围中最大元素。即第一个元素。剩下的元素成为一个新的“堆”。
函数原型为:
template< class RandomIt >void pop_heap( RandomIt first, RandomIt last );template< class RandomIt, class Compare >void pop_heap( RandomIt first, RandomIt last, Compare comp );
说明:
1. 第一种形式: 使用默认规则operator<
2. 第二种形式: 使用自定义二元比较函数comp
4.sort_heap
对齐参数迭代器指定范围内的[first,last)范围内的元素进行排序。
函数原型为:
template< class RandomIt >void sort_heap( RandomIt first, RandomIt last );template< class RandomIt, class Compare >void sort_heap( RandomIt first, RandomIt last, Compare comp );
说明;
1. 第一种形式: 使用默认规则operator<
2. 第二种形式: 使用自定义二元比较函数comp
3. 算法执行后,该区间和内部的元素不在是堆了。
例子:
-------------省略----------------- vector<int> vec1 = { 1, 2, 4, 5, 6, 3 }; //建立堆 make_heap(vec1.begin(), vec1.end()); //插入堆 vec1.push_back(10); push_heap(vec1.begin(), vec1.end()); //移除堆栈的第一个元素 pop_heap(vec1.begin(), vec1.end()); //出栈后我们可以看到其实容器vector中元素并没有被移除, //前面元素为堆,最后一个元素不为堆, //因此,我们后面进行的堆操作必须要让这些元素还是堆,有两种做法 //一:移除掉最后一个元素,vec1.push_back() //vec1.pop_back(); //第二种做法:就是重新再建堆 make_heap(vec1.begin(), vec1.end()); //排序 sort_heap(vec1.begin(), vec1.end());-------------省略-----------------
输出结果为:
vec1: 1 2 4 5 6 3make_heap vec1: 6 5 4 1 2 3 push_back vec1: 6 5 4 1 2 3 10 push_heap vec1: 10 5 6 1 2 3 4 pop_heap vec1: 6 5 4 1 2 3 10 sort_heap vec1: 1 2 3 4 5 6 10
这里我们采用第二种做法,可以看出,pop_heap其实未将元素真正的移除。
【但是为什么操作会破坏堆的结构,我还不知道】
- 四.c++中的算法--排序及相关操作---堆操作
- 四.c++中的算法--排序及相关操作---局部排序
- 四.c++中的算法--排序及相关操作---合并排序
- 四.c++中的算法--排序及相关操作---搜索
- 四.c++中的算法--排序及相关操作---全部元素排序
- 四.c++中的算法--排序及相关操作---根据某个元素排序
- 堆排序及其相关操作
- c++STL排序及相关操作
- 10.排序及相关操作
- 堆排序算法及C语言实现
- 最大堆相关操作
- 堆的相关操作
- 二叉树-----数组存储结构及操作算法的实现------堆排序
- 堆操作与堆排序
- 堆操作与堆排序
- 字符串相关操作、问题及算法提纲
- 【c++】堆排序算法
- C算法--堆排序
- dump
- XML STUDY_NOTE
- Leetcode Add to List 628. Maximum Product of Three Numbers
- 【数据结构】揭开面纱(摘抄)
- 一个c程序
- 四.c++中的算法--排序及相关操作---堆操作
- Python 面向对象(进阶篇)
- Socket编程之htons(), ntohl(), ntohs(),htons() 函数
- 1.DeckBulid 基本代码笔记
- 不用管这个QwQ
- 四.c++中的算法--排序及相关操作---合并排序
- eclipse classpath路径
- 四.c++中的算法--排序及相关操作---搜索
- 初始化二维vector的方法