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

数据结构:堆的应用

堆排序

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

显然,冒泡排序的时间复杂度是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)

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

我们可以看看运行实例:

冒泡排序:

堆排序:

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

 


http://www.kler.cn/news/364273.html

相关文章:

  • COSCon'24 志愿者招募令:共创开源新生活!
  • WPF+MVVM案例实战-设备状态LED灯变化实现
  • 蓝牙资讯|iOS 18.1 正式版下周推送,AirPods Pro 2耳机将带来助听器功能
  • PDF.js的使用及其跨域问题解决
  • 记一次js泄露pass获取核心业务
  • 探索音频在线剪辑工具的奇妙世界
  • Lesson10---list
  • Oracle SQL Developer 同时打开多个table的设置
  • Mysql索引结构前缀匹配原理
  • arcpy实现批量分区统计
  • 【如何获取股票数据18】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股解禁限售数据获取实例演示及接口API说明文档
  • 分享一个开源的、自托管的 API 创建工具——Strapi
  • 【Unity踩坑】无法关闭Unity(Application.Shutdown.CleanupEngine)
  • 高边坡稳定安全监测预警系统解决方案
  • 文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑负荷时空迁移的5G基站与配电网协同优化运行 》
  • mfc 最小二乘法
  • 道可云人工智能元宇宙每日资讯|咸阳首个人工智能算力中心投运
  • openpnp - 解决“底部相机校正成功后, 开机归零时,吸嘴自动校验失败的问题“
  • 使用freemarker实现在线展示文档功能开发,包括数据填充
  • 【NPM】工程化依赖包/库开发 之 基础知识
  • 【2024工业图像异常检测代码复现】GLASS
  • 【Linux】进程池
  • 前端——原生Selection api操作选中文本 样式、取消样式(解决标签的无限嵌套问题)
  • 《Java与API的浪漫邂逅:一键获取商品详情》
  • 在Centos7.9服务器上使用LVM方式挂载磁盘以及Windows磁盘性能测试与Linux磁盘性能测试命令hdparm详细
  • 构建简单的梯度提升决策树(GBDT)模型:MATLAB 实现详解