-
最小最大堆
添加时间:2013-5-25 点击量: 
//最小最大堆的定义,一颗完全二叉树,根节点为最小层,最小层和最大层瓜代呈现,若是x为最小层的节点,那么他就是以x为根节点的二叉树的最末节点,若是x为最大层的节点,那么他就是以x为根节点的二叉树的最大节点
//支撑双端队列的实现(1:可以或许插入随便率性一个值 2:可以或许删除最大值 3:可以或许删除最小值)
//实现从节点1开端,0舍弃
/
2009/06/03 By xylh
/
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 1000
struct element {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int key;
};
element heap[MAXSIZE];
//断定节点地点是最大还是最小层,最小层返回true
bool level(int i)
{
&#160;&#160;&#160; double k = log(i)/log(2);
&#160;&#160;&#160; if((int)k%2 ==0) return true;
&#160;&#160;&#160; else return false;
}
//在最大层向上追溯
void max_verify(element heap[], int n, element item)
{
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int i = n;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int parent = n/4;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; while(parent) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(heap[parent].key < item.key) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[i] = heap[parent];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i = parent;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; parent = parent/4;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[i] = item;
}
void min_verify(element heap[], int n, element item)
{
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int i = n;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int parent = n/4;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; while(parent) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(heap[parent].key > item.key) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[i] = heap[parent];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i = parent;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; parent = parent/4;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[i] = item;
}
void (element heap[], int n, element item)
{
&#160;&#160;&#160;&#160;&#160;&#160;&#160; (n)++;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(n == MAXSIZE) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; printf("heap is full\n");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; exit(1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(n == 1) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[n].key = item.key;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int parent = n/2;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; switch(level(parent)) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160; case true:
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(heap[parent].key > item.key) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[n] = heap[parent];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; min_verify(heap, parent, item);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; max_verify(heap, n, item);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; case false:
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(heap[parent].key < item.key) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[n] = heap[parent];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; max_verify(heap, parent, item);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; min_verify(heap, n, item);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
}
//寻找子节点和后序节点中小节点
int min_grand_child(element heap[], int n, int i)
{
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int min = 2i;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int k[5] = {2i+1, 4i, 4i+1, 4i+2, 4i+3};
&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(int j=0; k[j]<=n&&j<=4; ++j) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(heap[k[j]].key < heap[min].key)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; min = k[j];
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return min;
}
element del_min(element heap[], int n)
{
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(n < 1) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; printf("heap is empty\n");
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; exit(1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(n == 1) return heap[(n)--];//case 1
&#160;&#160;&#160;&#160;&#160;&#160;&#160; element item = heap[(n)--];
&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[0].key = heap[1].key;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int k, i, last = (n)/2, parent;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(i=1; i<=last; ) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; k = min_grand_child(heap, n, i);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(item.key <= heap[k].key) break;//case 2(a)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[i] = heap[k];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(k <= 2i+1) {//case 2(b)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i = k;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; parent = k/2;//case 2(c)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(item.key > heap[parent].key) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; element temp = item;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; item = heap[parent];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[parent] = temp;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; i = k;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; heap[i] = item;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return heap[0];
}
element del_max(element heap[], int n)
{
}
int main()
{
&#160;&#160;&#160;&#160;&#160;&#160;&#160; int n = 0;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(int i=1; i<=10; ++i) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; element item;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; item.key = i;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; (heap, &n, item);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; del_min(heap, &n);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(int i=1; i<=n; ++i) {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; printf("%d ", heap[i].key);
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160;&#160;&#160;&#160;&#160; printf("\n");
&#160;&#160;&#160;&#160;&#160;&#160;&#160; return 0;
}
struct heap{
无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
&#160;&#160;&#160; int size;
&#160;&#160;&#160; int a[11000];
&#160;&#160;&#160; heap(){size=0;}
&#160;&#160;&#160; void (int x){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int p;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(p=++size;p>1&&a[p>>1]>x;a[p]=a[p>>1],p>>=1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a[p]=x;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160; void pop(int &x){
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int p,c;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(x=a[p=1],c=2;c<size&&(a[c+=(c+1<size&&a[c+1]<a[c])?1:0]<a[size]);a[p]=a[c],p=c,c<<=1);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a[p]=a[size--];
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;&#160;&#160; }h;