STL初步——堆Heap

『写在前面的一些基础语法』

1.什么是堆

堆(heap)是一类特殊的数据结构,常用的堆为二叉堆,形式上是一个数组,本质上是一棵完全二叉树。

2.什么是完全二叉树?

二叉树:每个节点最多只有两个结点

满二叉树:一个深度为h且有2^h - 1 个结点的二叉树。(每个内部节点都有两个儿子结点)

完全二叉树:若设二叉树的高度为h,除第h层外,其他各层(1~h-1)的结点数都达到最大个数,第h层从右向左连续缺若干结点的二叉树。(要么有两个儿子,要么只有左儿子)

最小堆(小根堆)

是一棵除根结点以外的每个结点i,键值都小于等于其孩子结点键值的完全二叉树A[parent(i)]<=A[i])。

小根堆

最大堆(大根堆)

是一棵除根结点以外的每个结点i,键值都大于等于其孩子结点键值的完全二叉树A[parent(i)]>=A[i])

『一些基础操作』

第一个参数是数组或向量的头指针,第二个是数组或向量的尾指针(注意这里是尾后指针或尾后迭代器,而不是最后一个元素的地址)。第三个参数是比较函数,不写的时候,默认是大根堆(注意如果要自定义比较函数话:最大堆用小于函数;最小堆用大于函数)。

  •  make_heap(first_pointer,end_pointer,compare_function);

作用:依据已有的各元素构建堆

  • pop_heap(first_pointer,end_pointer,compare_function);

作用:重新排序堆。它把first和last-1这两个堆元素交换位置,然后将[first,last-1)的之间的元素做成一个堆,不包括last-1,并非把最大(小)弹出。

  • push_heap(first_pointer,end_pointer,compare_function);

作用:假设由[first,last-1)是一个有效的堆,然后,再把堆中的新元素last-1加进来,做成一个堆,堆的范围变成[first,last)

  • sort_heap(first_pointer,end_pointer,compare_function);

作用:sort_heap对[first,last)中的序列进行排序。它假设这个序列是有效堆。(当然,经过排序之后就不是一个有效堆了)

这部分知识很多都是来自大佬的:https://blog.csdn.net/wscdylzjy/article/details/46711743

『代码代码』

#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
bool cmp(const int a,const int b){
	return a > b;
}
int main(){
	int a[10]={8,7,5,6,1,2,4,3,9};
	int size = 9;
	//构建堆
	make_heap(&a[0],&a[size],cmp);
	cout<<"make_heap:"<<endl;
	for(int i=0; i<=size; i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	//它把first和last-1这两个堆元素交换位置,然后将[first,last-1)的之间的元素做成一个堆,不包括last-1。
	pop_heap(&a[0],&a[size],cmp);
	cout<<"pop_heap:"<<endl;
	for(int i=0; i<=size; i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	//将last-1的元素加入到堆中,将范围变成[first,last)
	push_heap(&a[0],&a[size],cmp);
	cout<<"push_heap:"<<endl;
	for(int i=0; i<=size; i++){
		cout<<a[i]<<" ";
	}
	cout<<endl;
	//将堆从大到小排序
	sort_heap(&a[0],&a[size],cmp);
	cout<<"sort_heap:"<<endl;
	for(int i=0; i<=size; i++){
		cout<<a[i]<<" ";
	}
	return 0;
}

『代码实现结果』

『最后的一些问题』

所谓的头指针和尾指针就是需要生成堆的范围,左闭右开【)

猜你喜欢

转载自blog.csdn.net/sinat_40872274/article/details/81206475