【C语言数据结构】堆


文章目录


#include <stdio.h>
#include <stdlib.h>

typedef int ElemType;

typedef struct{
	ElemType *data; // 堆的数值大小为一个数组指针 
	int size; // 堆的长度 
	int capacity; // 堆的容量		
}heap; 

void BuildMaxHeap(ElemType A[], int len); // 创建一个最大堆 
void HeadAdjust(ElemType A[], int k, int len);	// 堆向下调整 


// 创建一个最大堆
void BuildMaxHeap(ElemType A[], int len) {
	// 从最后的一个分支节点开始调整为堆 
	for (int i = len / 2 ; i > 0 ; i--) {
		HeadAdjust(A, i, len);
	} 
} 

// 堆向下调整 
void HeadAdjust(ElemType A[], int k, int len) {
	A[0] = A[k]; // 把最初的根节点记为root放在下标为0的位置 
	// 需要有等号 i <= len 
	for (int i = 2 * k; i <= len; i = i * 2) {
		if (i <len && A[i] < A[i + 1]) {
			// 右儿子比左儿子大时候转为右节点否则保持为左节点 
			i++;
		} 
		if (A[0] >= A[i]) {
			// 当根节点比两个儿子节点都要大时保持大根堆特性退出调整 
			break;
		} else {
			// 有个儿子比根节点大时将儿子节点赋予根节点root 
			A[k] = A[i];
			// 将儿子节点变为子树的根节点(新root)进行向下调整
			k = i;
		}
	}
	// 需要调整的节点赋予该呆的位置 
	A[k] = A[0];
} 

int main(){
	heap h;
	printf("请分别输入堆的长度 容量:");
	scanf("%d %d", &(h.size), &(h.capacity));
	h.data = (ElemType *)malloc((h.capacity + 1) * sizeof(ElemType));
	h.data ++;
	for (int i = 0; i < h.size; i++) {
		scanf("%d", (h.data) + i);
	}
	h.data --;
	BuildMaxHeap(h.data, h.size);
	for (int i = 1; i <= h.size; i++) {
		printf("%d ", *(h.data + i));
	}
	free(h.data);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值