小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
堆的介绍
堆的含义
如图片显示,这就是一个小根堆,特点是:完全二叉树、根处值小于两个子节点的值。
同样的大根堆,就是结点大于两个子节点的完全二叉树。
存储方式
根据图片我们也许会选择树这种数据结构来表示堆,实际上使用树的数据结构是有些复杂的,我们可以使用更简单更好理解的数组来存取堆。
根据完二叉树的特性,我们让根节点的值存放在heap[1]中,那么两个子节点的下标为heap[21] 与 heap[21+1]。
添加操作
1
当我们向堆中添加一个元素时,我们首先要将元素添加在数组的最后一位,假设要添加的值为2,在图示中的位置如下:
代码:
heap[len+1]=x;
2
我们可以看到2是小于其父节点4的,这并不满足小根堆。所以我们需要让2向上“飘”。
我们将2与4比较,发现小于,便交换2、4位置。
代码:
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;
}