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

数据结构:堆的应用

堆排序

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

显然,冒泡排序的时间复杂度是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.lryc.cn/news/470582.html

相关文章:

  • Spring Boot 实现文件分片上传和下载
  • 夹逼准则求数列极限(复习总结)
  • 【python】OpenCV—WaterShed Algorithm(1)
  • 查找与排序-插入排序
  • JAVA基础:多线程 (学习笔记)
  • 盲盒小程序/APP系统,市场发展下的新机遇
  • Unity3D LayoutGroup组件详解
  • [NeetCode 150] Foreign Dictionary
  • 小新学习K8s第一天之K8s基础概念
  • 如何用终端批量修改一个文件夹里面所有图片的后缀名?
  • 关于AI网络架构的文章
  • 【ChatGPT】在多轮对话中引导 ChatGPT 保持一致性
  • 【Chapter 7】因果推断中的机器学习:从T-学习器到双重稳健估计
  • vim的使用方法
  • OPPO携手比亚迪共同探索手机与汽车互融新时代
  • Apache Linkis:重新定义计算中间件
  • go gorm简单使用方法
  • 【c++高级篇】--多任务编程/多线程(Thread)
  • 【力扣专题栏】两数相加,如何实现存储在链表中的整数相加?
  • SOLID - 接口隔离原则(Interface Segregation Principle)
  • arrylist怎么让他变得不可修改
  • SpringMVC实战(3):拓展
  • Vue应用中使用xlsx库实现Excel文件导出的完整指南
  • 【数据分析】Power BI的使用教程
  • 融合ASPICE与敏捷开发:探索汽车软件开发的最佳实践
  • 后台管理系统的通用权限解决方案(三)SpringBoot整合Knife4j生成接口文档
  • 保研考研机试攻略:python笔记(1)
  • 在浏览器中运行 Puppeteer:解锁新能力
  • Kafka消费者故障,出现活锁问题如何解决?
  • pytorch 交叉熵损失函数 BCELoss