您的位置:首页
二项队列的查找插入合并操作
2017-05-13 16:28
176 查看
源码例如以下:
/* <span style="color:#ff0000;">一棵二次幂堆</span>是一棵左有序的堆,由右子树为空左子树为全然二叉树构成的根组成 <span style="color:#ff0000;">二项队列</span>:是二次幂堆的一个集合。 当中不存在相等大小的堆。其结构由队列节点数目确定 相应整数的二进制表示。 */ #include <stdlib.h> #include <stdio.h> #define maxBQsize 40 typedef struct PQnode* PQlink; typedef struct pq* PQ; struct Item{int data;char c;}; struct PQnode{Item key;PQlink l,r;}; struct pq{PQlink *bq;}; PQlink z = NULL; //连接两个大小相等的二次幂堆 PQlink pair(PQlink p,PQlink q){ if(p->key.data<q->key.data){ p->r = q->l; q->l = p; return q; } else{ q->r = p->l; p->l = q; return p; } } //插入操作 PQlink PQinsert(PQ pq, Item v){ int i; PQlink c, t = (PQlink)malloc(sizeof *t); c = t, c->l = z; c->r = z; c->key = v; for(i=0;i<maxBQsize;i++){ if(c==z)break; if(pq->bq[i] == z){ pq->bq[i] = c; break; } c = pair(c,pq->bq[i]);pq->bq[i] = z; } return t; } //两个二项队列中的合并操作 #define test(c,b,a) 4*(c) + 2*(b) + 1*(a) void BQjoin(PQlink *a, PQlink *b){ int i ; PQlink c = z; for(i=0;i<maxBQsize;i++) switch(test(c!=z,b[i]!=z,a[i]!=z)){ case 2: a[i] = b[i];break; case 3: c=pair(a[i],b[i]);a[i]=c;break; case 4: a[i]=c;c=z;break; case 5: c =pair(c,a[i]);a[i] = z; break; case 6: case 7: c = pair(c,b[i]); } } //二项队列中删除最大元素的操作 Item PQdelmax(PQ pq){ int i , max; PQlink x; Item v; PQlink temp[maxBQsize]; for(i=0,max=-1;i<maxBQsize;i++) if(pq->bq[i]!=z) if(max==-1 || v.data<pq->bq[i]->key.data){ max = i; v = pq->bq[max]->key; } x = pq->bq[max]->l; for(i=max;i<maxBQsize;i++) temp[i]=z; for(i=max;i>0;i--){ temp[i-1]=x; x = x->r; temp[i-1]->r=z; } free(pq->bq[max]);pq->bq[max] = z; BQjoin(pq->bq,temp); return v; } main(){ }
相关文章推荐
- 二项队列的查找插入合并操作
- C++链表的创建、插入、删除、查找、合并、排序、修改等操作的实现
- 关于链表结构的基本操作 c 实现 (创建,插入删除,反转,合并链表,查找,是否有环,链表相交情况)
- C++ 单链表操作 插入、删除、查找、排序、合并
- 顺序表的查找、插入、删除、合并操作及其优缺点
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 顺序表的查找、插入、删除、合并操作及其优缺点
- [zz]跳表(Skip List)的介绍以及查找插入删除等操作
- 【程序员面试宝典】数据结构基础二单链表循环链表的操作 建立|插入删除|打印|合并
- 链表的相关操作查找插入删除(c++ 数据结构)
- 顺序队列的初始化,建立,插入,查找,删除。
- 单向链表的操作:创建,删除,插入,销毁,查找
- C语言链表的创建、插入、查找、删除、清空操作
- 使用JAVA代码来模拟线性链表的相关操作(增加,删除,插入及查找等)
- oracle 插入、合并、查询、聚合操作
- 单链表的各种操作(建立,查找,删除,插入,归并等)
- 跳表(Skip List)的介绍以及查找插入删除等操作
- 单链表操作(建表、插入、删除、查找、求表长),
- c语言心得-----数组中对元素的操作排序,查找,插入,和删除
- C# 操作在Word表格中插入新行(表格含合并行)