四.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()

  1. 在指定区间内插入一个元素。新插入的元素放在堆栈的末尾,即尾指针
  2. 必须保证区间原有元素是一个“堆”

函数原型:

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其实未将元素真正的移除。
【但是为什么操作会破坏堆的结构,我还不知道】