優先佇列(堆)C 實現原始碼

2021-06-13 22:55:18 字數 1841 閱讀 1204

堆是一棵完全二叉樹,最小元素在根結點上,任意子樹也是乙個堆。對於堆中的任意乙個位置i上的元素,其左兒子在2i位置上,右兒子在2i+1位置上,它的父節點在 2/i 位置上。

堆的插入:

為了保持堆為完全二叉樹,在堆的最後乙個位置建立空結點,如果空結點的父節點大於要插入的結點,就將父節點移入空結點中,依此類推,直到要插入的結點能放入移空的位置中。

堆的刪除(刪除根結點,也就是最小的元素):

將根結點兩個子結點中較小者提至根結點,再將那個較小的子節點的兩個子節點的較小者提公升,依此類推,直到將最後乙個結點移入最近移空的結點中。

注:為了方便實現,堆的第乙個元素是從1開始的,而非從0開始。

heap.h

#include "utility.h"

#define mindata (-32767)

struct heapstruct

;typedef struct heapstruct *priorityqueue;

priorityqueue initialize( int maxelements)

void makeempty( priorityqueue h )

int isfull( priorityqueue h)

int isempty( priorityqueue h )

void insert( int x, priorityqueue h )

// i/2 為 i結點的父節點

//h->size = h->size + 1;

for( i = ++h->size; h->elements[ i/2 ] > x; i /= 2 ) //運算子優先順序會不會有問題 ++i > ->

h->elements[ i ] = x;

//test

cout << i << ": " << h->elements[ i ] << endl;

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

}int findmin( priorityqueue h )

void printheap( priorityqueue h )

}

heap.cpp

#include "heap.h"

#define maxsize (1000)

void main()

else

break;

case '1':

cout << "輸入要插入元素的個數:";

cin >> n;

while( n-- )

break;

case '2':

cout << "最小元素:" << findmin( h ) << endl;

break;

case '3':

cout << "最小元素:" << deletemin( h ) << "被刪除!" << endl;

break;

case '4':

printheap( h );

break;

default:

break;

} }while( cmd != 'q');

system("pause");

}

用堆實現優先佇列

堆的性質 1.乙個是他是乙個陣列 當然你也可以真的用鍊錶來做。2.他可以看做乙個完全二叉樹。注意是完全二叉樹。所以他的葉子個數剛好是nsize 2個。3.我使用的下標從1開始,這樣好算,如果節點的位置為i,他的父節點就是i 2,他的左孩子結點就是i 2,右孩子結點就是i 2 1,如果下標從0開始,要...

用堆實現優先佇列

話不多說,先上 include include 定義乙個堆得結構體,struct myheap 調整資料,維持堆得性質,這個和上次heapify的作用一樣 只是這個時從子道父節點這樣的判斷而已。int increasekey myheap pheap,int npos else 否則堆沒有被破壞,退...

c 堆與優先佇列

以最小堆為例,實現下列操作 向下調整演算法 void down int p heap p a 插入 void insert int a 將p的優先順序上公升為a void increasekey int p,int a 建立堆 void build 例題 poj 2051argus 思路 維持乙個最...