二叉堆
2016-06-23 11:20
246 查看
二叉堆
/**** **** **** **** **** ****
* Function Name : 二叉堆
* Description : 父结点的键值总是大於或等於任何一个子节点的键值
* 便於寻找父节点和子节点
**** **** **** **** **** ****/
const int Max=1000;
typedef int ElemType;
ElemType Heap[Max];
int Sift_Up(int i) //上移
{
ElemType temp;
bool flag;
flag = true;
if(i == 1) return 0;
do {
if(Heap[i] > Heap[i/2])
{temp=Heap[i]; Heap[i]=Heap[i/2]; Heap[i/2]=temp;}
else flag = false;
i /= 2;
}while(i>1 || flag);
return 1;
}
int Sift_Down(int i,int n) //下移
{
bool flag;
ElemType temp;
flag = false;
if(2*i > n) return 0;
do {
i*=2;
if(i+1 <= n && Heap[i+1] > Heap[i]) i++;
if(Heap[i/2] < Heap[i])
{temp=Heap[i]; Heap[i]=Heap[i/2]; Heap[i/2]=temp;}
else flag = false;
}while(2*i<=n || flag);
return 1;
}
int Insert(int &n,ElemType x) //插入元素
{
Heap[++n] = x;
if( Sift_Up(n) ) return n;
}
int Delete(int &n,int i) //输出元素
{
ElemType x,y;
x = Heap[i]; y = Heap
;
n--;
if(i == n+1) return x;
Heap[i] = y;
if(y >= x) Sift_Up(i);
else Sift_Down(i,n);
return x;
}
int Delete_Max(int &n) //输出最大值
{
ElemType x;
x = Heap[1];
Delete(n,1);
return x;
}
int Make_Heap(int n) //转换为大顶堆
{
int i;
for(i=n/2; i >= 1 ;i--) Sift_Down(i,n);
return n;
}
int HeapSort(int n) //非降序排序
{
int i;
ElemType temp;
Make_Heap(n);
for(i=n; i >= 2 ;i--) {
temp=Heap[i]; Heap[i]=Heap[1]; Heap[1]=temp;
Sift_Down(1,i-1);
}
return 1;
}
/**** **** **** **** **** ****
* Function Name : 二叉堆
* Description : 父结点的键值总是大於或等於任何一个子节点的键值
* 便於寻找父节点和子节点
**** **** **** **** **** ****/
const int Max=1000;
typedef int ElemType;
ElemType Heap[Max];
int Sift_Up(int i) //上移
{
ElemType temp;
bool flag;
flag = true;
if(i == 1) return 0;
do {
if(Heap[i] > Heap[i/2])
{temp=Heap[i]; Heap[i]=Heap[i/2]; Heap[i/2]=temp;}
else flag = false;
i /= 2;
}while(i>1 || flag);
return 1;
}
int Sift_Down(int i,int n) //下移
{
bool flag;
ElemType temp;
flag = false;
if(2*i > n) return 0;
do {
i*=2;
if(i+1 <= n && Heap[i+1] > Heap[i]) i++;
if(Heap[i/2] < Heap[i])
{temp=Heap[i]; Heap[i]=Heap[i/2]; Heap[i/2]=temp;}
else flag = false;
}while(2*i<=n || flag);
return 1;
}
int Insert(int &n,ElemType x) //插入元素
{
Heap[++n] = x;
if( Sift_Up(n) ) return n;
}
int Delete(int &n,int i) //输出元素
{
ElemType x,y;
x = Heap[i]; y = Heap
;
n--;
if(i == n+1) return x;
Heap[i] = y;
if(y >= x) Sift_Up(i);
else Sift_Down(i,n);
return x;
}
int Delete_Max(int &n) //输出最大值
{
ElemType x;
x = Heap[1];
Delete(n,1);
return x;
}
int Make_Heap(int n) //转换为大顶堆
{
int i;
for(i=n/2; i >= 1 ;i--) Sift_Down(i,n);
return n;
}
int HeapSort(int n) //非降序排序
{
int i;
ElemType temp;
Make_Heap(n);
for(i=n; i >= 2 ;i--) {
temp=Heap[i]; Heap[i]=Heap[1]; Heap[1]=temp;
Sift_Down(1,i-1);
}
return 1;
}
相关文章推荐
- Python实现二叉堆
- 二叉堆
- hihocoder:hiho一下第二十八周之二叉堆
- 堆排序实现
- c语言二叉堆《学习记录》poj3253
- 优先队列实现
- 二叉堆 build算法 c++ 数据结构与算法
- poj 3253 Fence Repair(哈夫曼树)
- ZOJ 2724 Windows Message Queue(二叉堆or优先队列)
- 优先队列二叉堆 C语言实现
- 数据结构(Java语言)——BinaryHeap简单实现
- 二叉堆(优先队列)
- 图论——Dijkstra+prim算法涉及到的优先队列(二叉堆)
- Huffman编码(Huffman树)
- 《数据结构与算法分析(c 描述)》—— 第六章笔记
- 二叉堆
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- C++ 二叉堆头文件
- 数据结构之优先队列--二叉堆(Java实现)
- 二叉堆维护优先队列