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

【算法】堆排序

算法-堆排序


前置知识
  • 堆(即将更新)

思路

我们现在有一个序列,怎么对它排序?
这是一个非常经典的问题,这里我们使用一个借助数据结构的算法——堆排序解决。

这里有一个序列,要对它升序排序
4 7 3 6 5 1 2 8 \begin{array}{cc} 4&7&3&6&5&1&2&8 \end{array} 47365128
构建一个堆:

将堆顶放入序列,删除堆顶

重复该操作






直至堆为空。
获得的序列为:
1 2 3 4 5 6 7 8 \begin{array}{cc} 1&2&3&4&5&6&7&8 \end{array} 12345678


算法参数
  • 平均时间复杂度: Θ ( n log ⁡ n ) \Theta(n\log n) Θ(nlogn)
  • 最好时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 最坏时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 空间复杂度: Θ ( n ) \Theta(n) Θ(n)
  • 稳定性:不稳定

实现代码
  • 手写堆版本
void heapify(int a[],int n,int i){//维护堆的性质int largest=i,l=2*i+1,r=2*i+2;if (l<n&&a[l]>a[largest])largest=l;if (r<n&&a[r]>a[largest])largest=r;if (largest!=i){swap(a[i],a[largest]);heapify(a,n,largest);}
}
void HeapSort(int a[],int n){//堆排序for (int i=n/2-1;i>=0;i--)heapify(a,n,i);for (int i=n-1;i>0;i--){swap(a[0],a[i]);heapify(a,i,0);}
}

练习
  • 洛谷【模板】排序
http://www.lryc.cn/news/231478.html

相关文章:

  • 51单片机应用从零开始(三)
  • 如何在 Nginx Proxy Manager(NPM)上部署静态网站
  • http的几种方法
  • var、let、const关键字的特性,以及let、const暂时性死区的作用
  • IDEA 高分辨率卡顿优化
  • 【AIGC】一起学习prompt提示词(4/4)【经典】【15种提示词技巧】
  • Linux实战一天一个小指令--《文件管理/文件查找》
  • CocosCreator3.8神秘面纱 CocosCreator 项目结构说明及编辑器的简单使用
  • JJJ:python学习笔记
  • SpringSecurity6从入门到上天系列第七篇:讲明白SpringBoot的自动装配完善上篇文章中的结论
  • ClickHouse 原理解析之基础知识总结
  • 最小花费——最短路
  • Spark DataFrame join后移除重复的列
  • NextJS工程部署到阿里云linux Ecs
  • 汽车以太网IOP测试新利器
  • 高防IP是什么?如何隐藏源站IP?如何进行防护?
  • ElasticSearch---查询es集群状态、分片、索引
  • Angular 使用教程——基本语法和双向数据绑定
  • 【ASP.NET】Hello World
  • AI创作系统ChatGPT网站源码+支持最新GPT-Turbo模型+支持DALL-E3文生图/AI绘画源码
  • C#_查找图片(按键精灵找图)
  • C#中.NET Framework4.8 控制台应用通过EF访问新建数据库
  • 无防御香港服务器如何防CC
  • MyBatis的插件能在哪些地方进行拦截?
  • 【BUG库】 记录自己学习工作中遇到的程序BUG
  • 卡尔曼家族从零解剖-(07) 高斯分布积分为1,高斯分布线性变换依旧为高斯分布,两高斯函数乘积仍为高斯。
  • 设计模式-访问者模式(Visitor)
  • C++二分查找算法:132 模式解法二枚举2
  • JavaWeb-HTML
  • 新外卖霸王餐小程序、H5、微信公众号版外卖系统源码