堆
堆在物理意义上是一个数组。
堆在逻辑意义上是一个完全二叉树
大堆:父> =子
小堆:父<=子
1.头文件
声明堆的一些基本函数(接口),你别忘了测试单元!
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
typedef int HPDataType;//类型
typedef struct Heap
{
HPDataType* _a;//数据
int _size;//大小
int _capacity;//容量
}Heap;
void HeapInit(Heap*hp, HPDataType*a, int n);//创建堆
void HeapDestory(Heap*hp);//销毁堆
void HeapPush(Heap*hp, HPDataType x);//插入
void HeapPop(Heap*hp);//删除
void Heapprint(Heap*hp);//打印
HPDataType HeapTop(Heap*hp);//取堆顶元素
int HeapSize(Heap*hp);/堆的大小
int HeapEmpty(Heap*hp);//判断堆是否为空
//不直接调Heaps
void HeapSort(HPDataType*a, int n);//用堆求取海量数据TOP k问题
void TestHeap();//测试
2.创建堆
创建堆的步骤:
1.导入数组中的数进入堆中;
2.初始化大小,容量
3.利用类似递归的分治来调整数组中的顺序,从而将数组调整为满足堆的定义。
void HeapInit(Heap*hp, HPDataType*a, int n)//初始化函数
{
assert(hp&&a);
hp->_a = (HPDataType*)malloc(sizeof(HPDataType)* n);
hp->_capacity = n;
hp->_size = n;
for (int i = 0; i < n; i++)
{
hp->_a[i] = a[i];
}
//堆排序
for (int i = (n - 2) / 2; i >= 0; --i)
{
ADjustDownMax(hp->_a, hp->_size, i);//大堆<-调整
//ADjustDownMin(hp->_a, hp->_size, i);//小堆-<调整
}
}
流程图如下:
利用分治的思想从下向上调整堆里的排列。