【堆】这是要搞事情啊——建立

interesting!堆:简单的说就是一棵完全二叉树的先序,满足任意父结点大于子结点的叫大根堆,反之则是小根堆。


建立

建立(小根堆)算法(简单粗略加通俗):

循环以下步骤

把此数(a[i])“塞”到堆尾,然后不停的和它父结点(a[i/2])比较,小就换。


给一个硬模拟的代码:

void put(int k)
{
	int now,next;//now子结点,next父结点
	heap[len++]=k;
	now=len-1;
	while(now>1)
	{
		next=now/2;
		if(heap[now]>=heap[next])//只要符合小根堆的条件了就break
			break;
		swap(heap[now],heap[next]);//否则就交换
		now=next;
	}
}

其实不难懂,但是像我们这种懒癌党怎么会愿意打呢

以下是直接用STL库函数的代码,两行解决(需添加algorithm、iostream及using namespace std头文件):

void put(int k)
{
	heap[len++]=k;
	//push_heap(heap,heap+len);
	push_heap(heap,heap+len,greater<int>());
}


好吧。似乎并没有什么用……

其他堆的东西继续写,也在这个分类,后面会有例子的,




原文地址:https://www.cnblogs.com/LinqiongTaoist/p/7203763.html