当前位置: 首页 > article >正文

堆排序实现

头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int HPDataType;

typedef struct Heap
{
	HPDataType* a;
	int size;
	int capacity;
}HP;
void Swap(HPDataType* px, HPDataType* py);
void AdjustDown(HPDataType* a, int n, int parent);
void AdjustUp(HPDataType* a, int child);
void HPInit(HP* php);
void HPDestroy(HP* php);
// 插入后保持数据是堆
void HPPush(HP* php, HPDataType x);
HPDataType HPTop(HP* php);

// 删除堆顶的数据
void HPPop(HP* php);

bool HPEmpty(HP* php);

函数实现

#include"Heap.h"

void HPInit(HP* php)
{
	assert(php);
	php->a = NULL;
	php->size = 0;
	php->capacity = 0;
}

void HPDestroy(HP* php)
{
	assert(php);
	free(php->a);
	php->a = NULL;
	php->capacity = 0;
	php->size = 0;
}

void Swap(HPDataType* px, HPDataType* py)
{
	HPDataType tmp = *px;
	*px = *py;
	*py = tmp;
}

void AdjustUp(HPDataType* a, int child)
{
	int parent = (child - 1) / 2;
	//while (parent >= 0)
	while(child > 0)
	{
		if (a[child] > a[parent])
		{
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (parent - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

void HPPush(HP* php, HPDataType x)
{
	assert(php);

	if (php->size == php->capacity)
	{
		size_t newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;
		HPDataType* tmp = realloc(php->a, sizeof(HPDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		php->a = tmp;
		php->capacity = newCapacity;
	}

	php->a[php->size] = x;
	php->size++;

	AdjustUp(php->a, php->size-1);
}

HPDataType HPTop(HP* php)
{
	assert(php);

	return php->a[0];
}

void AdjustDown(HPDataType* a, int n, int parent)
{
	int child = parent * 2 + 1;
	while (child < n)
	{
		// 假设法
		if (child+1 < n && a[child + 1] < a[child])
		{
			++child;
		}

		if (a[child] < a[parent])
		{
			Swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

void HPPop(HP* php)	
{
	assert(php);
	assert(php->size > 0);

	Swap(&php->a[0], &php->a[php->size - 1]);
	php->size--;
		
	AdjustDown(php->a, php->size, 0);
}


bool HPEmpty(HP* php)
{
	assert(php);

	return php->size == 0;
}

测试文件

void HeapSort(int* a, int n) {
	int end = n - 1;
	for (int i = (n - 1 - 1) / 2; i >= 0; i--) {
		AdjustDown(a, n, i);
	}
	while (end > 0){
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		end--;
	}
}
int main() {
	int a[] = { 50,100,70,65,60,32 };
	int i = 0;
	HeapSort(a, sizeof(a) / sizeof(int));
	while (i < (sizeof(a)/sizeof(int))){
		printf("%d\n",a[i]);
		i++;
	}
	return 0;
}

实现效果

代码是在堆的实现上面改的,所以可以看到有不少是没用到的,实现效果想添加的话可以自己添加


http://www.kler.cn/a/411555.html

相关文章:

  • SycoTec 4060 ER-S德国高精密主轴电机如何支持模具的自动化加工?
  • CANopen多电机控制的性能分析
  • 【AI绘画】Midjourney进阶:色调详解(上)
  • Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面
  • Python 爬虫从入门到(不)入狱学习笔记
  • redis数据类型详解
  • Linux服务器驱动安装
  • HarmonyOS:应用沙箱
  • 源码解读笔记:协程的 ViewModel.viewModelScope和LifecycleOwner.lifecycleScope
  • 【MCU】微控制器的编程技术:ISP 与 IAP
  • VTS:基于Apache SeaTunnel的开源向量数据迁移工具
  • 鸿蒙学习自由流转与分布式运行环境-跨端迁移(2)
  • C++ STL - vector/list讲解及迭代器失效
  • 数据结构——小小二叉树第三幕(链式结构的小拓展,二叉树的创建,深入理解二叉树的遍历)超详细!!!
  • Vue进阶面试题目(四)
  • 【设计模式】【创建型模式(Creational Patterns)】之原型模式(Prototype Pattern)
  • 25A物联网微型断路器 智慧空开1P 2P 3P 4P-安科瑞黄安南
  • C# 泛型 学习理解记录
  • vue3+ts 我写了一个跟swagger.yml生成请求和响应实体(接口)
  • 电商平台数据获取:解锁商业洞察的多元渠道
  • #Verilog HDL# Verilog中的UDP原语
  • 2024算法基础公选课练习五(DFS2)
  • 前端---CSS(部分用法)
  • C++的中的继承
  • 计算机操作系统——进程控制(Linux)
  • 第八篇:CamX RawHdr Feature Enable