堆
说的堆,我们就知道有两种堆的方式
小堆(大堆)中:任意一个关键码均小于(大于)等于它的左右孩子的关键码,位于堆顶节点的关键码最小(最大),从根节点到每个节点的路径上手族元素组成的序列都是递增(递减)的
堆存储在下标为0开始的数组中,因此在堆中给定下标为i的节点时
如果i=0,节点i是根节点,没有双亲节点;否则节点i的双亲节点为(i-1)/2
如果2*i+1 <= n-1,则节点i的做孩子为节点2*i +1,否则节点i无左孩子
如果2*i +2 <= n-1,则节点i的右孩子为节点2*i +2,否则节点i无右孩子
heap.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#define HEAPMAXSIZE 1000
typedef char heaptype;
typedef int(*Compare)(heaptype a,heaptype b);
typedef struct heap{
heaptype data[HEAPMAXSIZE];
size_t size;
Compare cmp;
}heap;
void heapinit(heap *hp,Compare cmp);
void heapdestroy(heap *hp);
void heapinsert(heap *hp,heaptype value);
void heapcreat(heap *hp,heaptype arr[],size_t size);
int heapgettop(heap *hp,heaptype *root);
void heaperase(heap *hp);
void heapsort(heap *hp,heaptype arr[],size_t size);
堆的初始化与销毁
具体代码实现
void heapinit(heap *hp,Compare cmp)
{
if(hp == NULL)
{
return;
}
hp->cmp = cmp;
hp->size = 0;
return;
}
void heapdestroy(heap *hp)
{
if(hp == NULL)
{
return;
}
hp->cmp =