堆的操作—添加

172 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

堆的介绍

image.png

堆的含义

如图片显示,这就是一个小根堆,特点是:完全二叉树、根处值小于两个子节点的值。

同样的大根堆,就是结点大于两个子节点的完全二叉树。

存储方式

根据图片我们也许会选择树这种数据结构来表示堆,实际上使用树的数据结构是有些复杂的,我们可以使用更简单更好理解的数组来存取堆。

根据完二叉树的特性,我们让根节点的值存放在heap[1]中,那么两个子节点的下标为heap[21] 与 heap[21+1]。

添加操作

1

当我们向堆中添加一个元素时,我们首先要将元素添加在数组的最后一位,假设要添加的值为2,在图示中的位置如下:

image.png

代码:

heap[len+1]=x;

2

我们可以看到2是小于其父节点4的,这并不满足小根堆。所以我们需要让2向上“飘”。

我们将2与4比较,发现小于,便交换2、4位置。

image.png

代码:

	if(heap[i]<heap[i/2]){
			int temp=heap[i];
			heap[i]=heap[i/2];
			heap[i/2]=temp;
		}

3

综合以上代码,可以得出:

#include<stdio.h>
int heap[10]={5,1,3,4,5,7};
int len;

//向堆中插入x 
void insert( int x, int heap[]){
	int i=len+1;
	len++;
	heap[i]=x;
	while(i>1){
		if(heap[i]<heap[i/2]){
			int temp=heap[i];
			heap[i]=heap[i/2];
			heap[i/2]=temp;
		}
		else
			break;
		
		i=i/2;
	}
}

//输出堆
void print(int heap[]){
	printf("len=%d\n",len);
	int i=1;
	while(i<=len){
		printf("%d ",heap[i++]);
	}
	printf("\n");
} 
int main(){

	len=5;
	print(heap);
	insert(2,heap); 
	print(heap);
	return 0;
} 

image.png