1. 程式人生 > >STL原始碼—heap最大堆,最小堆

STL原始碼—heap最大堆,最小堆

 最大堆和最小堆都是一棵完全二叉樹。

    最大堆:是指根節點的關鍵字值是堆中的最大關鍵字值,且每個節點若有兒子節點,其關鍵字值都不小於其兒子節點的關鍵字值。

    最小堆:是指根節點的關鍵字值是堆中的最小關鍵字值,且每個節點若有兒子節點,其關鍵字值都不大於其兒子節點的關鍵字值。


最大堆的插入操作

   步驟:

  1. 把當前節點數i設定為已知堆的節點數加1即i=++(*n),即新增的元素放在最下一層作為新的葉子節點。求出節點i的父節點parent=i/2;判斷是否為空堆,並比較所插入元素與父節點關鍵字值的大小;
  2. 若所插入節點關鍵字值大於父節點關鍵字值即item>heap[parent],則把父節點向下移,並把父節點作為當前節點,依次求父節點,即依次沿著樹枝向上延伸;
  3. 把元素item插入到正確位置;

最大堆的刪除操作

    最大堆的刪除,即刪除最大的元素。我們先取最後的元素提到根結點,然後刪除最大值,然後再把新的根節點放到合適的位置。

#include <stdio.h>  
#include <stdlib.h>  
#define MAX_SIZE 10  
int heap[MAX_SIZE];  

/*最大堆的插入操作*/  
/*注:堆的下標是從1開始,而不是0*/  
void max_Heap_insert(int *heap,int *n,int item)  
{  
	int i,parent;//i為當前節點,parent為i的父節點  
	if((*n)==MAX_SIZE)//堆為滿  
	{  
		printf("The heap is full\n");  
		exit(1);  
	}  
	i=++(*n);  
	parent=i/2;  
	while((i!=1) && (item>heap[parent]))//若堆為非空,且所插入資料item大於父節點的關鍵字值  
	{  
		heap[i]=heap[parent];//父節點關鍵字值下移  
		i=parent;//把父節點作為當前節點  
		parent/=2;//依次求父節點  
	}  
	heap[i]=item;//插入到正確的位置  
}  
/*最大堆的刪除操作*/  
int max_Heap_delete(int *heap,int *n)  
{  
	int item,temp;  
	int child,parent;  
	if(*n==0)//若為空堆  
	{  
		printf("The heap is empty.\n");  
		exit(1);  
	}  
	item=heap[1];//把最大堆的最大元素賦給item  
	temp=heap[(*n)--];//堆的最後節點關鍵字值  
	parent=1;  
	child=2*parent;  
	while(child<=(*n))  //<迴圈次數的限制
	{  
		if(child<*n && heap[child]<heap[child+1])  
			child++;//找出堆中最大關鍵字值的節點  
		if(temp>=heap[child])break;//把最大節點關鍵字值與最後節點關鍵字值比較  
		else  
		{//若堆中存在比最後節點關鍵字值大的節點,則交換位置  
			heap[parent]=heap[child];  
			parent=child;  
			child*=2;  
		}  
	}  
	heap[parent]=temp;//插入到正確位置  
	return item;//返回刪除的關鍵字值  
}  
int main()  
{  
	int item,i;  
	int n=0;  
	for(i=1;i<MAX_SIZE;i++)  
	{  
		scanf("%d",&item);  
		max_Heap_insert(heap,&n,item);  
	}  
	for(i=1;i<=n;i++)  
		printf("%d ",heap[i]);  
	printf("\n");  
	item=max_Heap_delete(heap,&n);  
	printf("The deleted data is:%d",item);  
	printf("\n");  
	for(i=1;i<=n;i++)  
		printf("%d ",heap[i]);  
	return 0;  
}  

輸出:

1 2 32 12 55 334 7 23 7 67
334 32 55 23 12 2 7 1 7
The deleted data is:334
55 32 7 23 12 2 7 1