堆(優先佇列,最大堆的基本操作,堆的例題)

2021-08-04 13:24:47 字數 3087 閱讀 2667

1、堆(優先佇列):是一種特殊的「佇列」,取出元素的順序是

依照元素的優先權(關鍵字)大小,而不是元素進入佇列的先後順序。

2、堆的特性:

(1)結構性:用陣列表示的完全二叉樹(堆一定是完全二叉樹);

(2)有序性:任一結點的關鍵字是其子樹所有結點的最大值(或最小值)

「最大堆(maxheap)」,也稱「大頂堆」:任一結點的關鍵字是其子樹所有結點的最大值。

「最小堆(minheap)」,也稱「小頂堆」 :任一結點的關鍵字是其子樹所有結點的最小值。

3、最大堆的基本操作:

!!!這裡主要講解最大堆,最小堆類似。這裡的所有操作都是建立在以下標為1開始儲存元素,下標為0的地方沒有儲存真實的元素

(1)、建立乙個空的堆

#define maxdata 10000

typedef

struct heapheap;

heap* creat_maxheap(int maxdata,heap* h)//建立乙個最大容量為maxdata的空堆

(2)、判斷乙個堆是否滿

int isfull_maxheap(heap* h)//判斷最大堆是否滿 

(3)、插入元素

void insert_maxheap(int x,heap* h)//向堆中插入乙個元素 

i = ++h->size;//i指向插入後堆中的最後乙個元素的位置

for ( ; h->a[i/2] < x; i/=2 )

h->a[i] = h->a[i/2]; //上濾x

h->a[i] = x; //將x插入

return ;

}

(4)、判斷堆是否為空

int isempty_maxheap(heap* h)

(5)、刪除堆中最大的元素並返回

int deletemax_heap(heap* h) 

// 從最大堆h中取出鍵值為最大的元素,並刪除乙個結點

maxdata = h->a[1];//取出根結點最大值

//用最大堆中最後乙個元素從根結點開始向上過濾下層結點

temp = h->a[h->size--];

//最開始用最後乙個結點代替根結點,再交換順序使之成為堆

for(parent = 1;parent

*2<= h->size;parent = child)

if(temp >= h->a[child])

break;

else

h->a[parent] = h->a[child];//移動temp元素到下一層

}h->a[parent] = temp;

return maxdata;

}

(6)、簡單例題:將陣列存放為最大堆,再遍歷輸出,刪除最大元素後再遍歷刪除後的結果

#include 

#include

#include

#define maxdata 10000

typedef

struct heapheap;

heap* creat_maxheap(int maxdata,heap* h)//建立乙個最大容量為maxdata的空堆

int isfull_maxheap(heap* h)//判斷最大堆是否滿

void insert_maxheap(int x,heap* h)//向堆中插入乙個元素

i = ++h->size;//i指向插入後堆中的最後乙個元素的位置

for ( ; h->a[i/2] < x; i/=2 )

h->a[i] = h->a[i/2]; //上濾x

h->a[i] = x; //將x插入

return ;

} int isempty_maxheap(heap* h)

int deletemax_heap(heap* h)

// 從最大堆h中取出鍵值為最大的元素,並刪除乙個結點

maxdata = h->a[1];//取出根結點最大值

//用最大堆中最後乙個元素從根結點開始向上過濾下層結點

temp = h->a[h->size--];

//最開始用最後乙個結點代替根結點,再交換順序使之成為堆

for(parent = 1;parent*2

<= h->size;parent = child)

if(temp >= h->a[child])

break;

else

h->a[parent] = h->a[child];//移動temp元素到下一層

}h->a[parent] = temp;

return maxdata;

}void print_maxheap(heap* h)

int main()

; int i,len = 5;

heap* h = (heap*)malloc(sizeof(heap));

h = creat_maxheap(len,h);

printf("依次新增:");

for(i = 0;iprintf("%d ",a[i]);

insert_maxheap(a[i],h);

} printf("\n最大堆:");

print_maxheap(h);

printf("\n刪除的元素:%d",deletemax_heap(h));

printf("\n刪除元素後的最大推:");

print_maxheap(h);

}

執行結果:

堆(優先佇列)的基本操作

堆是一棵完全二叉樹,所以可以利用陣列來實現。以1號作為root,則對於陣列中的任意乙個i,其左兒子在 2 i 右兒子在 2 i 1 父親在 i 2 下面以最小堆為例,實現一些基本操作 define inf 0x3f3f3f3f define max 1005 int heap max heap 0 ...

堆(優先佇列,即最大堆,最小堆)

優先佇列 priority queue 特殊的 佇列 取出元素的順序是 依照元素的優先權 關鍵字 大小,而不是元素進入佇列的先後順序。堆的兩個特性 結構性 用陣列表示的完全二叉樹 有序性 任一結點的關鍵字是其子樹所有結點的最大值 或最小值 最大堆 maxheap 也稱 大頂堆 最大值 最小堆 min...

優先佇列(堆)的基本結構(1)

摘要 優先佇列是指的佇列可以提高最高優先順序的資訊,並且它的刪除與插入操作都可以保證這個結構不被破壞 1 基本資料結構 由乙個代表堆大小的變數,堆容量的變數,還有乙個可以動態分配的陣列.2 陣列的第乙個元素不用,編號從1開始.該佇列可以看成一棵二叉樹,父節點總是比子節點要小.同時堆是乙個被完全填滿的...