C语言 实现堆

Posted Wecccccccc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 实现堆相关的知识,希望对你有一定的参考价值。

代码如下:

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

typedef int HDataType;

//堆的定义
typedef struct heap
{
	HDataType *data;
	int size;
	int capacity;
}heap;


//交换
void Swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

//检查容量
void checkCapacity(heap * hp)
{
	if (hp->capacity == hp->size)
	{
		int newC = hp->capacity == 0 ? 1 : 2 * hp->capacity;
		hp->data = (HDataType *)realloc(hp->data, sizeof(HDataType) * newC);
		hp->capacity = newC;
	}
}

//向下调整
void shiftDown(int *arr, int n, int cur)
{
	int child = 2 * cur + 1;
	while (child < n)
	{
		if (child + 1 < n && arr[child + 1] < arr[child])
		{
			++child;
		}
		if (arr[child] < arr[cur])
		{
			Swap(&arr[child], &arr[cur]);
			cur = child;
			child = 2 * cur + 1;
		}
		else break;
	}
}

//向上调整
void shiftUp(int *arr, int n, int cur)
{
	int parent = (cur - 1) / 2;
	while (cur > 0)
	{
		if (arr[cur] < arr[parent])
		{
			Swap(&arr[cur], &arr[parent]);
			cur = parent;
			parent = (cur - 1) / 2;
		}
		else break;
	}
}

//堆的初始化
void heapInit(heap *hp)
{
	assert(hp);
	hp->data = NULL;
	hp->capacity = hp->size = 0;
}

//堆的创建
void heapCreate(heap * hp, int *arr, int n)
{
	assert(hp);
	hp->data = (HDataType *)malloc(sizeof(HDataType) *n);
	memcpy(hp->data, arr, sizeof(HDataType) * n);
	hp->capacity = hp->size = 0;
	for (int i = (n - 2) / 2; i >= 0; i--)
	{
		shiftDown(hp->data, hp->size, i);
	}
}

//堆的删除
void heapPop(heap *hp)
{
	if (hp->size > 0)
	{
		Swap(&hp->data[0], &hp->data[hp->size - 1]);
		hp->size--;
		shiftDown(hp->data, hp->size, 0);
	}
}

//获取堆顶元素
HDataType heapTop(heap *hp)
{
	assert(hp);
	return hp->data[0];
}

//判空
int heapEmpty(heap *hp)
{
	if (hp == NULL || hp->size == 0)
	{
		return 1;
	}
	else return 0;
}

//堆排序
void heapSort(heap *hp)
{
	assert(hp);
	for (int i = (hp->size - 2) / 2; i >= 0; i--)
	{
		shiftDown(hp->data, hp->size, i);
	}
	int end = hp->size - 1;
	while (end > 0)
	{
		Swap(&hp->data[0], &hp->data[end]);
		shiftDown(hp->data, end, 0);
		end--;
	}
}

//打印堆
void HeapPrint(heap *hp)
{
	assert(hp);
	for (int i = 0; i < hp->size; i++)
	{
		printf("%d ",hp->data[i]);
	}
	printf("\\n");
}

//销毁堆
void heapDestory(heap *hp)
{
	assert(hp);
	free(hp->data);
	hp->data = NULL;
	hp->capacity = hp->size = 0;
}

//堆的插入
void heapPush(heap *hp, HDataType val)
{
	assert(hp);
	checkCapacity(hp);
	hp->data[hp->size++] = val;
	shiftUp(hp->data, hp->size, hp->size - 1);
}

以上是关于C语言 实现堆的主要内容,如果未能解决你的问题,请参考以下文章

堆排序的c语言实现

初识堆C语言实现

C语言实现的堆的向下调整算法和建堆算法

C语言实现的堆的向下调整算法和建堆算法

C语言实现的堆的向下调整算法和建堆算法

C语言代码片段