【堆的操作】:要求实现最大堆:
1、原始数据为 1 2 3 4 5 6 ,请构建二叉堆 ,依次打印二叉堆中的元素
2、打印堆中的最大元素并删除后,依次打印二叉堆中的元素
/*1、原始数据为 1 2 3 4 5 6 ,请构建二叉堆 ,依次打印二叉堆中的元素
2、打印堆中的最大元素并删除后,依次打印二叉堆中的元素
*/
#include<stdio.h>
#define MAXSIZE 100
#define MaxData 9999
#include <malloc.h>
typedef int ElementType;
/*堆结构体定义,采用顺序结构*/
typedef struct HeapStruct {
ElementType data[MAXSIZE]; /* 存储堆元素的数组 从下标1开始存储*/
int Size; /* 堆的当前元素个数 */
} MaxHeap;
/**/
/*最大堆初始化*/
MaxHeap *CreateHeap( ) {
MaxHeap *H = malloc( sizeof( MaxHeap ) );
H->Size = 0;
return H;
}
/* 将元素item 插入最大堆H */
void InsertHeap( MaxHeap *H, ElementType item ) {
if (H->Size >= MAXSIZE) {
printf("堆已满!\n");
return;
}
/* 1.i指向插入后堆中的最后一个元素的位置 */
int i = ++H->Size;
/*2.堆化:插入的元素向上渗透*/
while (i > 1 && item > H->data[i / 2]) {
H->data[i] = H->data[i / 2];
i /= 2;
}
H->data[i] = item;
}
/*自上而下堆化,即元素向下渗透*/
void HeapDown( MaxHeap *H, int r ) {
/* 下滤:将H中以H->Data[r]为根的子堆调整为最大堆 */
ElementType tmp = H->data[r];
int i = 2 * r;
while (i <= H->Size) {
if (i < H->Size && H->data[i] < H->data[i + 1])
i++;
if (tmp >= H->data[i])
break;
H->data[r] = H->data[i];
r = i;
i *= 2;
}
H->data[r] = tmp;
}
/* 最大堆H元素删除 */
ElementType DeleteMax( MaxHeap *H ) {
if (H->Size == 0) {
printf("堆已空!\n");
exit(1);
}
/* 1.取出根结点最大值,用最大堆中最后一个元素替换根节点元素 */
ElementType maxItem = H->data[1];
H->data[1] = H->data[H->Size--];
/* 2.堆化:从根结点开始向下渗透*/
HeapDown(H, 1);
return maxItem;
}
/*建立二叉堆*/
void BuildHeap( MaxHeap *H ) {
/* 元素已放入最大堆的数组中 */
/* 调整H->data[]中的元素,使满足最大堆的有序性 */
/* 堆化:从最后一个结点的父节点开始向下渗透,直到根结点1 */
int i;
for (i = H->Size / 2; i > 0; i--) {
HeapDown(H, i);
}
}
/*打印堆中的元素*/
void PrintHeap(MaxHeap *H) {
int i;
if (H->Size == 0) {
printf("最大堆已为空");
return;
}
printf("堆中的元素为:");
for (i = 1; i <= H->Size; i++) {
printf("%d ", H->data[i]);
}
printf("\n");
}
void main() {
int i;
MaxHeap *H = CreateHeap();
//原始数据为 1 2 3 4 5 6
for (i = 1; i <= 6; i++) {
H->data[i] = i;
H->Size++;
}
BuildHeap(H);
PrintHeap(H);
printf("取出当前堆中的最大元素为:%d\n", DeleteMax(H));
PrintHeap(H);
}