最小最大堆

    添加时间: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;

    无论对感情还是对生活,“只要甜不要苦”都是任性而孩子气的,因为我们也不完美,我们也会伤害人。正因为我们都不完美,也因为生活从不是事事如意,所以对这些“瑕疵”的收纳才让我们对生活、对他人的爱变得日益真实而具体。—— 汪冰《世界再亏欠你,也要敢于拥抱幸福》
    分享到: