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開始.該佇列可以看成一棵二叉樹,父節點總是比子節點要小.同時堆是乙個被完全填滿的...