探究C++优先队列

结构

我们平时会用到一种很高效的数据结构:优先队列,用法和用途就不在这里讲了,那么它的内部到底是怎么工作的呢?为了探究,我写了一个仿函数,用来显示它的每次比较:

struct itn{
    bool operator()(int a,int b) {
        printf("%d %d\n",a,b);
        return a>b;   //因为经过测试,仿函数的返回值跟重载是相反的,所以这里是从小到大
    }
};
priority_queue<int,vector<int>,itn>p;

我把1~7依次入队,输出是

因为入队本来就是有序的,所以不会交换任何元素。我们可以发现每一行的输出有点像树的一条边:父节点  子节点,像这样构成的一棵树就是一棵逐行读入的完全二叉树

所以,优先队列就是一棵树,它的排序就是堆排序

或许有的书上早就说明了,但都不如实践得出来的更令人信服。

执行

有的人说优先队列是程序执行中自动排序,那是因为它排序太快了(堆排序时间复杂度是log级别),实际上它只有push或pop之后才排序一次,排序完了再执行代码下一条。

#include<cstdio>
#include<queue>
using namespace std;
bool f;
struct itn{
	bool operator()(int a,int b) {
		putchar('>');
		if(f)return a<b; //从大到小 
		else return a>b; //从小到大
    }
};
priority_queue<int,vector<int>,itn>p;
int main()
{
	for(int i=1;i<=7;i++)p.push(i); //执行排序
	putchar('-');
	f=1;
	printf("\n%d\n",p.top());
	p.pop(); //执行排序
	printf("\n%d",p.top()); 
	return 0;
}

上面代码输出为

可见 f=true 后并没有变为从大到小,pop之后由于少了一个元素,整体调整,才输出了最大的7。

而且在输出了一串'>'之后才输出'-',说明排序完了才执行代码下一条。

猜你喜欢

转载自blog.csdn.net/weixin_43960287/article/details/84971392