typedef int elementtype;
/* start: fig6_4.txt */
#ifndef _binheap_h
#define _binheap_h
struct heapstruct;
typedef struct heapstruct *priorityqueue;
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
/* end */
/* 這裡實現的是最小堆 */
#include "binheap.h"
#include "fatal.h"
#include #define minpqsize (10) // 堆最小的尺寸
#define mindata (-32767)
// 堆的結構
struct heapstruct
;/* start: fig6_0.txt */
/** * 初始化堆
* @param maxelements 最大的容量
* @return 指向最大堆的指標
*/priorityqueue
initialize( int maxelements )
/* end */
void
makeempty( priorityqueue h )
/* start: fig6_8.txt */
/* h->element[ 0 ] is a sentinel */
/** * 插入操作
* @param x 待插入的元素
* @param h 要插入的目標堆
*/void
insert( elementtype x, priorityqueue h )
// 上濾(percolate up),如果父節點比 x 大,就將其給濾下來
for( i = ++h->size; h->elements[ i / 2 ] > x; i /= 2 )
h->elements[ i ] = h->elements[ i / 2 ];
h->elements[ i ] = x; // 最後剩下的位置就是 x 應該插入的位置
}/* end */
/* start: fig6_12.txt */
/** * 刪除最小元
* @param h
* @return 返回最小元
*/elementtype
deletemin( priorityqueue h )
/* 4*/ minelement = h->elements[ 1 ]; // 根節點即最小元
/* 5*/ lastelement = h->elements[ h->size-- ]; // 取出最後乙個元素,用於插入到刪除最小元之後的根節點處,然後下濾
/* 6*/ for( i = 1; i * 2 <= h->size; i = child )
/*14*/ h->elements[ i ] = lastelement;
/*15*/ return minelement;
}/* end */
/** * 查詢最小元,即取出根節點儲存的元素
* @param h
* @return
*/elementtype
findmin( priorityqueue h )
/** * 判斷堆是否為空
* @param h
* @return
*/int
isempty( priorityqueue h )
/** * 判斷堆是否已滿
* @param h
* @return
*/int
isfull( priorityqueue h )
/** * 銷毀堆
* @param h
*/void
destroy( priorityqueue h )
#if 0
/* start: fig6_14.txt */
for( i = n / 2; i > 0; i-- )
percolatedown( i );
/* end */
#endif
#include "binheap.h"
#include #define maxsize (1000)
int main()
printf("\n");
#endif
while (!isempty(h))
if (deletemin(h) != j++)
printf("error in deletemin, %d\n", j);
printf("done...\n");
return 0;
}
#include #include #define error( str ) fatalerror( str )
#define fatalerror( str ) fprintf( stderr, "%s\n", str ), exit( 1 )
(二叉)堆操作
堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...
簡單 二叉堆
堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...
演算法 二叉堆
二叉堆具體來說就是支援插入刪除查詢最值的資料結構,是一棵滿足堆性質的完全二叉樹,樹上的每乙個節點對應乙個權值。若樹中的任意乙個節點的權值都小於其父節點的權值,則稱該二叉樹滿足大根堆性質,即我們常說的大根堆。若書中任意乙個節點的全職都打與其父親節點的權值,則稱該二叉樹滿足小根堆性質,即小根堆。二者統稱...