堆 二叉堆 原始碼筆記

2022-01-11 14:15:56 字數 2964 閱讀 6712

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個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...

簡單 二叉堆

堆是一種比較有用的資料結構,是二叉樹的一種陣列的表示形式。最大堆和最小堆是二叉堆的兩種形式。最大堆 根結點的鍵值是所有堆結點鍵值中最大者。最小堆 根結點的鍵值是所有堆結點鍵值中最小者。而最大 最小堆集結了最大堆和最小堆的優點,這也是其名字的由來。最大 最小堆是最大層和最小層交替出現的二叉樹,即最大層...

演算法 二叉堆

二叉堆具體來說就是支援插入刪除查詢最值的資料結構,是一棵滿足堆性質的完全二叉樹,樹上的每乙個節點對應乙個權值。若樹中的任意乙個節點的權值都小於其父節點的權值,則稱該二叉樹滿足大根堆性質,即我們常說的大根堆。若書中任意乙個節點的全職都打與其父親節點的權值,則稱該二叉樹滿足小根堆性質,即小根堆。二者統稱...