堆排序(数据结构)

本期讲解堆排序的实现


1. 堆排序

堆排序即利用堆的思想来进行排序,总共分为两个步骤:

1. 建堆

• 升序:建大堆
• 降序:建小堆
2. 利用堆删除思想来进行排序.

建堆和堆删除中都用到了向下调整,因此掌握了向下调整,就可以完成堆排序。

PS: 向下调整的代码实现已在上一篇博客最后(Heap.c) 分享

堆排序的两种实现

在此,我们提倡第二种堆排序的方法

1.

cs 复制代码
int a[]={2,5,7,4,1,6,9,8,3};

void HeapSort(int* a,int n)
{
	Heap heap;
	HeapInitArray(&heap, a, n);//建立了小堆

	//排序
	int i = 0;
	while (!HeapEmpty(&heap))
	{
		a[i] = HeapTop(&heap);
		printf("%d\n",a[i]);
		i++;//为了打印
		HeapPop(&heap);
	}

	HeapDestroy(&heap);
}

缺点:

1.空间复杂度为O(N)
2.需要去写堆的数据结构(子函数)太麻烦。

2.

cs 复制代码
//找降序,建小堆
void HeapSort(HeapDataType* a ,int n)
{
	//1.原数组建小堆,时间复杂度O(N)
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		AdjustDown(a,n,i);//参数:目的地,个数,开始调整的位置(parent)
	}
	//2.交换,继续使用向下调整, 时间复杂度O(N*logN)
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0],&a[end]);
		AdjustDown(a,end,0);
		--end;
	}
}

堆排序的时间复杂度为o(N*logN)

这个博客如果对你有帮助,给博主一个免费的点赞就是最大的帮助**❤**

欢迎各位点赞,收藏和关注哦❤

如果有疑问或有不同见解,欢迎在评论区留言哦❤

后续我会一直分享双一流211西北大学软件(C,数据结构,C++,Linux,MySQL)的学习干货以及重要代码的分享

相关推荐
Dave.B21 分钟前
用【vtk3DLinearGridCrinkleExtractor】快速提取3D网格相交面
算法·3d·vtk
yaoh.wang28 分钟前
力扣(LeetCode) 1: 两数之和 - 解法思路
python·程序人生·算法·leetcode·面试·跳槽·哈希算法
又是忙碌的一天31 分钟前
二叉树的构建与增删改查(2) 删除节点
数据结构
小猪快跑爱摄影42 分钟前
【AutoCad 2025】【C#】零基础教程(四)——MText 常见属性
c#·autocad
Code Slacker1 小时前
LeetCode Hot100 —— 滑动窗口(面试纯背版)(四)
数据结构·c++·算法·leetcode
brave and determined1 小时前
CANN训练营 学习(day8)昇腾大模型推理调优实战指南
人工智能·算法·机器学习·ai实战·昇腾ai·ai推理·实战记录
总爱写点小BUG1 小时前
打印不同的三角形(C语言)
java·c语言·算法
yaoh.wang2 小时前
力扣(LeetCode) 27: 移除元素 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
2401_841495642 小时前
【自然语言处理】中文 n-gram 词模型
人工智能·python·算法·自然语言处理·n-gram·中文文本生成模型·kneser-ney平滑
San302 小时前
从零到一:彻底搞定面试高频算法——“列表转树”与“爬楼梯”全解析
javascript·算法·面试