数据结构:堆的应用

堆排序

假定有一组数据极多的数,让我们进行排序,那我们很容易想到一种经典的排序方法,冒泡排序,我们对冒泡排序的时间复杂度进行分析:

显然,冒泡排序的时间复杂度是O(n^2),当数据量巨大时,冒泡排序需要比较长时间才能完成排序,这在实际应用中是没有意义的。

而相比之下的堆排序时间开销则小得多。

接下来先给出堆排序的代码:

复制代码
void Swap(int* child, int* parent)
{
	int tem = *child;
	*child = *parent;
	*parent = tem;
}

void DownAdjust(int* p,int size,int parent)
{
	int child = parent * 2 + 1;
	while (child<size)
	{
		if (child<size-1 && p[child + 1] < p[child])//size-1,不是size
			++child;
		if (p[child] < p[parent])
		{
			Swap(&p[child], &p[parent]);//
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			break;
		}
	}
}

//堆排序
void HeapSort(int* p, int size)
{
	//1.建堆
	//先找到最后一个非叶子节点,然后逆序向下调整
	for (int i = (size - 1 - 1) / 2; i >= 0; i--)
	{
		DownAdjust(p, size, i);
	}
	//2.对堆排序
	int end = size - 1;
	while (end>0)
	{
		Swap(&p[0], &p[end]);
		DownAdjust(p, end, 0);
		--end;
	}
}

我们知道堆在逻辑上是完全二叉树,在物理上是数组,那么给一个很大的数组,我们完全对这个数组进行建堆,然后进行堆排序。

接下来对堆排序的时间复杂度进行分析:

一个程序的时间复杂度看的是执行次数最多的基本语句,因此看建堆的时间复杂度即可:
因为堆是完全二叉树,而满二叉树也是完全二叉树,此处为了简化使用满二叉树来证明 ( 时间复杂度本来看的
就是近似值,多几个结点不影响最终结果 ) :

因此,时间复杂度为O(n)

两者对比我们发现,堆排序显然是更优的。

我们可以看看运行实例:

冒泡排序:

堆排序:

可以看出,堆排序的优越性。

相关推荐
liguojun202519 小时前
智慧破局:重构体育场馆的运营与体验新生态
java·大数据·人工智能·物联网·重构·1024程序员节
Yupureki2 天前
《算法竞赛从入门到国奖》算法基础:入门篇-前缀和
c语言·数据结构·c++·算法·1024程序员节
CoderYanger2 天前
动态规划算法-01背包问题:50.分割等和子集
java·算法·leetcode·动态规划·1024程序员节
CoderYanger2 天前
动态规划算法-两个数组的dp(含字符串数组):48.最长重复子数组
java·算法·leetcode·动态规划·1024程序员节
金融小师妹2 天前
美联储议息夜:基于多智能体决策分歧模型的“鹰派降息”推演
人工智能·深度学习·1024程序员节
金融小师妹3 天前
基于NLP政策文本分析与多智能体博弈模拟的FOMC决策推演:“美联储传声筒”下的利率路径分歧
大数据·人工智能·深度学习·1024程序员节
打码人的日常分享4 天前
IPD项目质量体系管理方案
大数据·运维·人工智能·信息可视化·1024程序员节
CoderYanger4 天前
动态规划算法-两个数组的dp(含字符串数组):42.不相交的线
java·算法·leetcode·动态规划·1024程序员节
CoderYanger5 天前
动态规划算法-两个数组的dp(含字符串数组):43.不同的子序列
java·算法·leetcode·动态规划·1024程序员节
CoderYanger5 天前
动态规划算法-两个数组的dp(含字符串数组):41.最长公共子序列(模板)
java·算法·leetcode·动态规划·1024程序员节