二叉堆(優先對列)

2021-08-30 17:13:11 字數 2623 閱讀 3697

/***********=*\

| binheap.h |

\***********=*/

#ifndef _binheap_h_

#define _binheap_h_

#define elementtype int

#define minpqsize 2

#define mindata -10000

typedef struct heapstruct * priorityqueue;

//function list

priorityqueue initialize(int maxelements);

void destroy(priorityqueue h);

void makeempty(priorityqueue h);

void insert(elementtype x,priorityqueue h);

elementtype deletemin(priorityqueue h);

elementtype findmin(priorityqueue h);

int isempty(priorityqueue h);

int isfull(priorityqueue h);

#endif

/***********===*\

| binheap.c |

\***********===*/

#include "binheap.h"

#include #include //初始化優先佇列

priorityqueue initialize(int maxelements)

//判斷佇列是否已滿

int isfull(priorityqueue h)

//判斷佇列是否為空

int isempty(priorityqueue h)

//插入節點

void insert(elementtype x,priorityqueue h)

for(i=++h->size;h->elements[i/2]>x;i/=2)

h->elements[i] = h->elements[i/2];

h->elements[i]=x;

}//從節點p下濾

void percolatedown(int p,priorityqueue h)

elementtype element = h->elements[p];

while (i*2<=h->size)

else

break;

} h->elements[i] = element;

}//從節點p上濾

void percolateup(int p,priorityqueue h)

elementtype element = h->elements[p];

for(i=p;h->elements[i/2]>element;i=i/2)

h->elements[i] = h->elements[i/2];

h->elements[i]=element;

}//刪除最小元

elementtype deletemin(priorityqueue h)

minelement = h->elements[1];

lastelement = h->elements[h->size--];

for(i=1;i*2<=h->size;i=child)

h->elements[i]=lastelement;

return minelement;

}//降低關鍵字的值

void decreasekey(int p,elementtype value,priorityqueue h)

//增加關鍵字的值

void increasekey(int p,elementtype value,priorityqueue h)

//刪除節點

void delete(int p,priorityqueue h)

//構建堆

void buildheap(elementtype * et,int n,priorityqueue h)

for(i=0;ielements[i+1] = et[i];

} for(i=n/2;i>0;i--)

percolatedown(i,h);

}//列印二叉堆(優先佇列)

void printbinheap(priorityqueue h)

//int main()

; priorityqueue h = initialize(20);

buildheap(a,sizeof(a)/sizeof(int),h);

printbinheap(h);

decreasekey(8,20,h);

printbinheap(h);

increasekey(1,20,h);

printbinheap(h);

delete(1,h);

printbinheap(h);

insert(3,h);

printbinheap(h);

system("pause");

return 0;

}

優先佇列 二叉堆

優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...

二叉堆 優先佇列

堆 堆常見的二叉堆,這種資料結構有大根堆和小根堆。對於大根堆來說,每個父節點是大於他的兩個孩子節點的。也就是最大值在根節點。小根堆與之相反。如果堆用陣列實現的話,如果從1開始計數 因為0的位置可以在上慮或者下慮的時候做個暫存的位置 那麼乙個孩子的父節點是i 2 如果知道了父節點,而左孩子的節點位置為...

二叉堆(優先佇列)

0.1 本文總結於 資料結構與演算法分析,但源 均為原創 旨在理清二叉堆 優先佇列 堆的其他操作及其應用,以便讓朋友些知道為什麼要學習優先佇列 二叉堆 1.0 優先佇列定義 優先佇列是允許至少下列兩種操作的資料結構,insert 插入 它的工作時顯而易見的,以及 deletemin 刪除最小者 它的...