【数据结构】—— 堆的相关接口实现以及堆排序的实现

news/2024/5/20 10:33:28 标签: 数据结构, , 动态增长

的相关接口介绍Heap.h

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

typedef int HPDataType;

typedef struct Heap
{
	HPDataType* _array;
	int _size;
	int _Capacity;
}Heap;

void AdjustDown(HPDataType* a, int n,int root);
void HeapInit(Heap* hp, HPDataType* a, int n);
void HeapDestory(Heap* hp);
void AdjustUp(HPDataType* a, int n, int child);
void HeapPush(Heap* hp, HPDataType x);
void HeapPop(Heap* hp);
HPDataType HeapTop(Heap* hp);
int HeapSize(Heap* hp);
int HeapEmpty(Heap* hp);

//top k问题

//排序
void HeapSort(int* a, int n);
void HeapPrint(Heap* hp);
void HeapTest();

的相关接口实现Heap.c

#include"Heap.h"
void AdjustDown(HPDataType* a, int n,int root)
{//创建小
	assert(a);
	int parent = root;
	int child = parent * 2 + 1;

	while (child < n)
	{
		//找左右孩子里面小的那个
		if (a[child + 1] < a[child] && child+1 < n)
			++child;//指向右孩子
		//比较父节点与小的那个孩子的大小
		if (a[parent] > a[child])
		{
			HPDataType tmp = a[parent];
			a[parent] = a[child];
			a[child] = tmp;
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}
void HeapInit(Heap* hp, HPDataType* a, int n)
{
	assert(hp && a);
	hp->_array = (HPDataType*)malloc(n*sizeof(HPDataType));
	hp->_Capacity = hp->_size = n;
	memcpy(hp->_array, a, sizeof(HPDataType)*n);//用数组a给初始化
    //建

	for (int i = (hp->_size - 2) / 2; i >= 0; --i)
	{
		AdjustDown(hp->_array,hp->_size, i);
	}
}
void HeapPrint(Heap* hp)
{
	assert(hp);
	for (int i = 0; i < hp->_size; i++)
	{
		printf("%d ", hp->_array[i]);
	}
	printf("\n");
}
void HeapDestory(Heap* hp)
{
	assert(hp);
	free(hp->_array);
	hp->_array = NULL;
	hp->_Capacity = hp->_size = 0;
}
void AdjustUp(HPDataType* a, int n, int child)
{//创建小
	assert(a);
	int parent = (child - 1) / 2;

	while (child > 0)
	{
		if (a[parent] > a[child])
		{
			HPDataType tmp = a[parent];
			a[parent] = a[child];
			a[child] = tmp;

			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}
void HeapPush(Heap* hp, HPDataType x)
{
	assert(hp);
	if (hp->_size == hp->_Capacity)
	{
		hp->_Capacity *= 2;
		hp->_array = (HPDataType*)realloc(hp->_array, hp->_Capacity*sizeof(HPDataType));
		assert(hp->_array);
	}
	hp->_array[hp->_size] = x;
	hp->_size++;
	//调
	AdjustUp(hp->_array, hp->_size, hp->_size - 1);	
}
void Swap(HPDataType* p1, HPDataType* p2)
{
	HPDataType tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
void HeapPop(Heap* hp)
{
	assert(hp);
	Swap(&hp->_array[0], &hp->_array[hp->_size - 1]);

	hp->_size--;
	AdjustDown(hp->_array, hp->_size, 0);
}
HPDataType HeapTop(Heap* hp)
{
	assert(hp);
	Swap(&hp->_array[0], &hp->_array[hp->_size - 1]);

	return hp->_array[hp->_size - 1];
	hp->_size--;
	AdjustDown(hp->_array, hp->_size, 0);
}
int HeapSize(Heap* hp)
{
	assert(hp);
	return hp->_size;
}
void HeapTest()
{
	Heap hp;
	int a[10] = { 2, 4, 5, 4, 7, 8, 1, 7, 3, 6 };
	HeapInit(&hp, a, sizeof(a) / sizeof(int));
	//HeapPush(&hp, 0);
	//HeapPop(&hp);
	int ret = HeapSize(&hp);
	printf("%d\n", ret);
	HeapPrint(&hp);
}

http://www.niftyadmin.cn/n/1280911.html

相关文章

【数据结构】—— 二叉树相关接口的实现

公共头文件common.h #pragma once #include<stdio.h> #include<string.h> #include<assert.h> #include<stdlib.h>typedef char BTDatatype;typedef struct BinaryTreeNode {BTDatatype _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _…

备战招聘——信息获取与简历制作

招聘信息获取渠道&#xff1a; 吉大就业网 http://jdjyw.jlu.edu.cn/ 大街网 http://www.dajie.com/ HiAll&#xff08;应聘信息综合平台&#xff0c;推荐&#xff09; http://www.hiall.com.cn/ 一般简历投递分为四种类型&#xff1a; 宣讲会现场投递、邮箱投递、招聘网站投递…

【LeetCode】—— 相交链表LeetCode160题

LeetCode160题相交链表 题目描述 编写一个程序&#xff0c;找到两个单链表相交的起始节点。 如下面的两个链表&#xff1a; 在节点 c1 开始相交。 示例1&#xff1a; 输入&#xff1a;intersectVal 8, listA [4,1,8,4,5], listB [5,0,1,8,4,5], skipA 2, skipB 3 输…

DHTML快速入门

DHTML是神马玩意&#xff1f;说白点其实就是HTMLCSSJS&#xff0c;我想大部分人也是这么认为的。作为一名合格的测试人员必须了解和掌握这些知识&#xff0c;能看懂&#xff0c;也能写点。 本来想把之前规划的快速入门视频做完&#xff0c;但看到如下的资料这么tmd好&#xff0…

【LeetCode】—— 回文链表LeetCode234题

LeetCode234题回文链表 题目描述 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false示例 2: 输入: 1->2->2->1 输出: true解题思路 首先利用快慢指针找到链表的中间节点&#xff0c;再将链表的后半部分逆置之后对比两部分链表是否相同&#xf…

快速学习-机器学习(线性代数[矩阵])

线性代数 矩阵 矩阵的定义 特殊矩阵 矩阵中的概念 矩阵的加法 矩阵的乘法 矩阵的转置 矩阵的运算法则 矩阵的逆

【LeetCode】—— 复制带随机指针的链表LeetCode138题

LeetCode138题复制带随机指针的链表 题目描述 给定一个链表&#xff0c;每个节点包含一个额外增加的随机指针&#xff0c;该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的深度拷贝。 解题思路 代码实现 typedef struct RandomListNode RLNode; struct Rando…

Kali Linux 1.0

BackTrack下一代产品 Kali Linux 正式发布对外发布1.0版本,也算是一个大更新了. 还没下载的速度下载体验吧.kali linux正式发布&#xff0c;开放下载&#xff0c;含中文版期待已久的backtrack下一个版本kali linux终于面世了。kali-linux-1.0版本包含i386平台、amd64平台、arme…