バイナリヒープの抽象データ型:
1 #ifndefの_BinHeap_H 2 の#defineのElementTypeのINT 3 の#define minelement -1000 4。 構造体HeapStruct; 5のtypedef 構造体 HeapStruct *優先度つきキュー; // 構造体ポインタ 6。優先度つきキュー初期化(int型 MaxElements); // 初期化Aバイナリヒープ 7。 ボイド破壊( H優先度つきキュー); // バイナリヒープ操作を破壊する 8。 ボイド MakeEmpty(H優先度つきキュー); // バイナリヒープの動作をブランキング 。9 空隙INSERT(X-のElementType、優先度つきキューH); //はインサート 10のElementType DeleteMin(優先度つきキューHを); //は最低作動要素を削除し 11のElementType FindMin(優先度つきキューH); // 最小作動要素見つける 12は int型のisEmpty(優先度つきキューH) ; // バイナリヒープを分析すること空動作である 13は 、INT(優先度つきキューH、IsFull INT maxelement); //は、動作は完全なバイナリヒープであるか否かを決定 14優先度つきキューCreateHeap(のElementType []、優先度つきキューH、INT N-)。// バイナリヒープ・オペレーションを作成するために、配列を使用して 15 ボイドBuildHeap(のElementType A []、優先度つきキューH、INT N); // 使用バイナリヒープアレイ作成操作 16 #endifの 17。 18である 構造体HeapStruct { 19。 int型の容量、 20である INT サイズ; 21である のElementType * 元素、 22です }。
一般的なオペレーティングバイナリヒープ実装:
書式#include <iostreamの> 書式#include <stdio.hに> する#include <stdlib.h>に含ま の#include " Heap.h " 使用して 名前空間はstdを、 // 初期化Aバイナリヒープ 優先度つきキュー初期化(int型MaxElements){ 優先度つきキューH =(優先度つきキュー)はmalloc(はsizeof(構造体HeapStruct))。 H - >容量= MinElement。 H - >サイズ= 0 。 H - >要素=(のElementType *)はmalloc(MaxElements * はsizeof (のElementType))。 返すHを。 } // 挿入操作、主作用がある-フィルタ ボイド挿入(X-のElementType、優先度つきキューH){ int型I; のために(H-I ++ =>サイズ、I / 2 > = 1 ; I / = 2 ){ IF(H->要素[I / 2 ]> X-){ H - >要素[I] = H->要素[I / 2 ]。 } 他の{ 休憩。 } } H - >要素[I] = X。 } // 繰り返し新しい要素に注文時にヒープの動作を保証するために、挿入()を呼び出すことによって、バイナリヒープを持つ配列を作成する 優先度つきキューCreateHeap(のElementType A []、優先度つきキューH、INT N-)を{ ため(INT I = 0 ; I <N-; I ++ ) { インサート([I]、H)。 } } // 出力順序は、配列要素の順序で、すべての要素を全体バイナリヒープを印刷 ボイド{PrintBinHeap(優先度つきキューH) printf(" プライオリティキューは、次のとおりです。" ); のため(int型 I = 1。 ; I <= H->サイズ; I ++ ) { printf(" \ T%D "、H-> 要素[I])。 } printf(" \ n個" ); } // バイナリパイルの頂部要素を除去、すなわち、最小の素子と主操作である-フィルタ のElementType DeleteMin(優先度つきキューH){ ElementType LastElement = H->要素[H-> size-- ]。 ElementType MinElements = H->要素[ 1 ]。 int型私は、子供を。 ための式(I = 1 ; iが* 2 <= H->サイズを、iは= 子){ 子供は = I * 2 、 IF(!H-子=> H-サイズ&&>要素[子+ 1 ] <H->要素[子供]){ //は、ノードが一つだけ子ノード有しているか否かを判定する ++子を、 } もし(H->要素[子供] < LastElement){ H - >要素[I] = H-> 要素[子供]。 } 他の{ 休憩。 } } H - >要素[I] = LastElement。 リターンMinElements。 } // 破壊バイナリヒープ 無効(優先度つきキューH)を破壊{ フリー(H-> 要素); フリー(H)。 } // クリアバイナリヒープ、及び戻り空バイナリヒープ 空隙MakeEmpty(優先度つきキューH){ フリー(H-> 要素) } //は、バイナリヒープが空であるか否かを判断 INT のisEmpty(優先度つきキューH){ リターン H == NULLは、 } //は、バイナリヒープが満杯であるか否かを判断 INT IsFull(優先度つきキューH、int型maxelement){ リターン > H->サイズmaxelement。 } ElementType FindMin(優先度つきキューH){ リターン H->要素[ 1 ]。 } // 使用バイナリヒープアレイ作成操作は、線形時間O(N)かかり 空隙 PercolateDown(のElementType A []、INT I、INT N){ int型の子供、要素= ; A [I] int型Kを、 ため( K *; Iは、Kが= 2 <= N; K = 子){ 子供 = K * 2 。 もし(子供!= N && [チャイルド+ 1 ] < [子供]){ 子供 ++ ; } もし(要素> [子供]){ [k]は = [子供]。 } 他の{ 休憩。 } } [K] = 要素と } ボイド BuildHeap(のElementType []、優先度つきキューH、INT N){ ため(INT iはN / = 2、I> 0 ; i-- ){ PercolateDown(I、N)。 } 以下のために(INT iが= 1 ; I <= N; I ++ ){ H - >要素[I] = [I]。 H - >サイズ++ ; } } 空選挙() INT メイン(){ 優先度つきキューH; int型のn; printf(「要素の数を入力してください:\ N- 」); scanf関数(" %のD "、&N) ELEMENTTYPE [N + 1 ]。 printf(" を入力してください要素、スペースで区切られた:\ N- " ) のための(INT I = 1 ; I <= N; I ++ ){ scanf関数(" %のD "、および[I])。 } H =初期(68 )。 BuildHeap(、H、N)。 PrintBinHeap(H)。 printf(" %dの" 、FindMin(H))。 システム(「一時停止」)。 リターン 0 ; }