数据结构-堆的创建,销毁,插入,删除

堆在物理意义上是一个数组。

堆在逻辑意义上是一个完全二叉树

大堆:父> =子

小堆:父<=子

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);//小堆-<调整

	}
}

流程图如下:

利用分治的思想从下向上调整堆里的排列。

猜你喜欢

转载自blog.csdn.net/SoYangA/article/details/81953452
今日推荐