在实现堆的操作之前,先来明白什么是堆?
- 堆中某个节点的值总是不大于或不小于其父节点的值
- 堆总是一棵完全二叉树。
要说到完全二叉树,直观的判断就是,层序遍历一棵树,如果树的某个节点没有右子树或者是没有子树,那么从这个节点后面的所有节点都不能够有任何子树。
接下来我们说说堆。堆分为大堆跟小堆。大堆的意思就是每一个节点都是它这个节点树的最大值。小堆同理是最小值。
基本操作与实现
基本操作
//heap.h
#pragma once
#include <stdio.h>
#include <stddef.h>
#define HEAPMAX 1000
typedef char HeapType;
typedef int(*Compare)(int a, int b);//函数指针,来确定将来的堆是最大堆还是最小堆
typedef struct Heap{
HeapType data[HEAPMAX];
size_t size;
Compare cmp;
}Heap;
void HeapInit(Heap* heap, Compare cmp);//初始化堆
void HeapInsert(Heap* heap, HeapType to_insert);//在堆中插入
int HeapRoot(Heap* heap, HeapType* root);//取堆顶元素
void HeapErase(Heap* heap);//删除堆顶元素
void HeapDestroy(Heap* heap);//销毁堆
void HeapCreat(Heap* heap, HeapType array[], size_t size);//根据一个数组创建堆
void HeapSort(HeapType array[], size_t size);//堆排
实现
其实堆的操作都很简单,但是最核心的两个就是插入与删除。这两个我们单独来说。
#include "heap.h"
#define HEAD printf("===================%s====================\n",__FUNCTION__);
void HeapPrintChar(Heap* heap)
{
if(heap == NULL) {
return;
}
size_t i = 0;
for(; i < heap->size; ++i) {
printf("%c ", heap->data[i]);
}
printf("\n");
}
int Greater(int a, int b)
{
return a > b ? 1 : 0;
}
int Less(int a, int b)
{
return a < b ? 1 :