前面堆排序已经描述了二叉堆的基本操作,插入(O(logn))、删除(O(logn))和查询最大最小值(O(1)),但是两个二叉堆合并时却很不方便,一个一个调用插入方法完成合并需要O(n)。
[b]Binomial Queue[/b](二项队列):一个链表数组,每个元素指向一棵二项树,数组元素按二项树大小顺序排列。
[b]Binomial Tree(二项树) 是什么 图解[/b]
[img]http://dl.iteye.com/upload/picture/pic/89888/a0cfac4a-be6b-33b6-a720-9e39c8f2f7cf.bmp[/img]
[b]合并两个二项队列 图解[/b]
[img]http://dl.iteye.com/upload/picture/pic/89890/3b4fa5a8-29f4-32a8-88fc-9d42fd9a6489.bmp[/img]
二项队列的插入:就是与一个单节点的堆合并。
查询最大最小:遍历链表数组一遍。
删除最小:将被删除节点的子树变为一个新的二项队列,再与原二项队列合并。
数据结构表示
来自《数据结构与算法分析》
[b]Binomial Queue[/b](二项队列):一个链表数组,每个元素指向一棵二项树,数组元素按二项树大小顺序排列。
[b]Binomial Tree(二项树) 是什么 图解[/b]
[img]http://dl.iteye.com/upload/picture/pic/89888/a0cfac4a-be6b-33b6-a720-9e39c8f2f7cf.bmp[/img]
[b]合并两个二项队列 图解[/b]
[img]http://dl.iteye.com/upload/picture/pic/89890/3b4fa5a8-29f4-32a8-88fc-9d42fd9a6489.bmp[/img]
二项队列的插入:就是与一个单节点的堆合并。
查询最大最小:遍历链表数组一遍。
删除最小:将被删除节点的子树变为一个新的二项队列,再与原二项队列合并。
数据结构表示
typedef int ElementType;
typedef struct BinNode *Position;
struct BinNode
{
ElementType Element;
Position LeftChild;
Position NextSibling;// not LightChild
};
typedef struct BinNode *BinTree;
struct Collection
{
int CurrentSize;
BinTree TheTrees[MaxTrees];
};
typedef struct Collection *BinQueue;
来自《数据结构与算法分析》