堆是一棵完全二叉樹,最小元素在根結點上,任意子樹也是乙個堆。對於堆中的任意乙個位置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 思路 維持乙個最...