用c语言定义一个大顶堆实现堆的插入删除操作。在主函数中输入数据构建堆然后输出排序结果。
大顶堆是一种二叉树结构,每个节点的值都大于等于其子节点的值。可以使用数组来表示大顶堆,具体的实现如下:
#include <stdio.h>
#define MAX_HEAP_SIZE 100
int heap[MAX_HEAP_SIZE];
int heap_size = 0;
// 获取父节点的位置
int parent(int i) {
return (i - 1) / 2;
}
// 获取左子节点的位置
int left(int i) {
return 2 * i + 1;
}
// 获取右子节点的位置
int right(int i) {
return 2 * i + 2;
}
// 交换两个元素的值
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
// 向上调整,使得堆满足大顶堆的性质
void sift_up(int i) {
while (i > 0 && heap[i] > heap[parent(i)]) {
swap(&heap[i], &heap[parent(i)]);
i = parent(i);
}
}
// 向下调整,使得堆满足大顶堆的性质
void sift_down(int i) {
int max_index = i;
int l = left(i);
if (l < heap_size && heap[l] > heap[max_index]) {
max_index = l;
}
int r = right(i);
if (r < heap_size && heap[r] > heap[max_index]) {
max_index = r;
}
if (i != max_index) {
swap(&heap[i], &heap[max_index]);
sift_down(max_index);
}
}
// 插入一个元素
void insert(int x) {
heap[heap_size] = x;
heap_size++;
sift_up(heap_size - 1);
}
// 删除最大元素
void delete_max() {
if (heap_size == 0) {
return;
}
heap[0] = heap[heap_size - 1];
heap_size--;
sift_down(0);
}
// 构建堆
void build_heap() {
for (int i = parent(heap_size - 1); i >= 0; i--) {
sift_down(i);
}
}
int main() {
// 输入数据
int n;
printf("请输入要排序的元素个数:");
scanf("%d", &n);
printf("请输入%d个元素:", n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
insert(x);
}
// 构建堆并输出排序结果
build_heap();
printf("排序结果为:");
while (heap_size > 0) {
printf("%d ", heap[0]);
delete_max();
}
printf("\n");
return 0;
}
在主函数中,首先输入要排序的元素个数和元素值,然后逐个插入到堆中。接着调用 build_heap 函数构建堆,并不断删除堆顶元素并输出,从而得到排序结果
原文地址: https://www.cveoy.top/t/topic/dIaI 著作权归作者所有。请勿转载和采集!