一、Heap.h
#ifndef __HEAP_H__
#define __HEAP_H__
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <windows.h>
typedef int HeapDateType;
typedef struct Heap
{
HeapDateType* _a;
size_t _size;
size_t _capacity;
}Heap;
void HeapInit(Heap* hp, HeapDateType* a, size_t n);
void HeapMake(Heap* hp);
void HeapPush(Heap* hp, HeapDateType x);
void HeapPop(Heap* hp);
size_t GetHeapSize(Heap* hp);
size_t HeapEmpty(Heap* hp);
HeapDateType HeapTop(Heap* hp);
void HeapSort(Heap* hp);
void HeapAdjustDown(Heap* hp, int root);
void HeapAdjustUp(Heap* hp, int child);
void HeapPrint(Heap *hp);
void HeapTopK(HeapDateType* a, int size, int k);
#endif __HEAP_H__
二、Heap.c
#include "Heap.h"
void HeapInit(Heap* hp, HeapDateType* a, size_t n)
{
assert(hp);
hp->_a = (HeapDateType*)malloc(n*sizeof(HeapDateType));
memcpy(hp->_a, a, n*sizeof(HeapDateType));
hp->_size = n;
hp->_capacity = n;
}
void Swap(HeapDateType *x, HeapDateType *y)
{
*x ^= *y ^= *x ^= *y;
}
void HeapAdjustDown(Heap* hp, int root)
{
assert(hp);
int parent = root;
int child = parent * 2 + 1;
int flag = 0;
while (child < (int)hp->_size)
{
if (child + 1 < (int)hp->_size)
{
if (hp->_a[child] < hp->_a[child + 1])
{
child++;
}
}
if (hp->_a[child]>hp->_a[parent])
{
flag = 1;
Swap(hp->_a + child, hp->_a + parent);
}
if (flag == 0)
{
break;
}
parent = child;
child = parent * 2 + 1;
}
}
void HeapAdjustUp(Heap* hp, int child)
{
assert(hp);
assert(child > 0 && child < (int)hp->_size);
while (child)
{
HeapDateType parent = (child - 1) / 2;
if (hp->_a[parent] < hp->_a[child])
{
Swap(hp->_a + parent, hp->_a + child);
child = parent;
}
else
{
break;
}
}
}
void HeapMake(Heap* hp)
{
int parent = (int)(hp->_size - 2) / 2;
for (; parent >= 0; parent--)
{
HeapAdjustDown(hp, parent);
}
}
void CheckCapacity(Heap *hp)
{
assert(hp);
if (hp->_size >= hp->_capacity)
{
HeapDateType* ptr = (HeapDateType*)realloc(hp->_a, (hp->_capacity + 2)*sizeof(HeapDateType));
assert(ptr);
hp->_a = ptr;
hp->_capacity += 2;
}
}
void HeapPush(Heap* hp, HeapDateType x)
{
assert(hp);
CheckCapacity(hp);
hp->_a[hp->_size] = x;
hp->_size++;
HeapAdjustUp(hp, hp->_size - 1);
}
void HeapPop(Heap* hp)
{
assert(hp);
if (hp->_size == 0)
{
return;
}
else if (hp->_size == 1)
{
hp->_size--;
}
else
{
hp->_a[0] = hp->_a[hp->_size - 1];
hp->_size--;
HeapAdjustDown(hp, 0);
}
}
size_t GetHeapSize(Heap* hp)
{
assert(hp);
return hp->_size;
}
size_t HeapEmpty(Heap* hp)
{
assert(hp);
if (hp->_size)
{
return 0;
}
return 1;
}
HeapDateType HeapTop(Heap* hp)
{
assert(hp&&hp->_size > 0);
return hp->_a[0];
}
void HeapSort(Heap* hp)
{
assert(hp);
int sz = hp->_size;
while (hp->_size>1)
{
Swap(&hp->_a[0], &hp->_a[hp->_size - 1]);
hp->_size--;
HeapAdjustDown(hp, 0);
}
hp->_size = sz;
}
void HeapPrint(Heap *hp)
{
for (int i = 0; i < (int)hp->_size; i++)
{
printf("%d ", hp->_a[i]);
}
printf("\n");
}
void HeapTopK(HeapDateType* a, int size, int k)
{
Heap hp;
HeapInit(&hp, a, k);
HeapMake(&hp);
for (int i = k; i < size; i++)
{
if (a[i] < hp._a[0])
{
hp._a[0] = a[i];
HeapAdjustDown(&hp, 0);
}
}
printf("前%d个最小值:", k);
HeapPrint(&hp);
}
三、test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "Heap.h"
int main()
{
Heap hp;
HeapDateType a[] = { 53, 17, 78, 9, 45, 65, 87, 23, 31 };
size_t size = sizeof(a) / sizeof(HeapDateType);
HeapInit(&hp, a, size);
HeapMake(&hp);
printf("初始化堆:");
HeapPrint(&hp);
if (!HeapEmpty(&hp))
{
printf("节点数:%d\n", GetHeapSize(&hp));
}
printf("插入100:");
HeapPush(&hp, 100);
HeapPrint(&hp);
printf("删除:");
HeapPop(&hp);
HeapPrint(&hp);
printf("堆顶:%d\n", HeapTop(&hp));
printf("升序:");
HeapSort(&hp);
HeapPrint(&hp);
HeapTopK(a, size, 3);
system("pause");
return 0;
}
四、执行结果: