プライオリティキュー(A) - 二分ヒープ

バイナリヒープの抽象データ型:

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 ;
}
 

おすすめ

転載: www.cnblogs.com/XiJiBaLuanXie/p/11827244.html