热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【数据结构】【堆排序】

这里是先建立最大堆,再从小到大输出堆元素。具体实现及其解释见代码。总结:像这样支持插入元素和寻找最大(小)值元素的数据结构称

这里是先建立最大堆,再从小到大输出堆元素。具体实现及其解释见代码。

总结:像这样支持插入元素和寻找最大(小)值元素的数据结构称为优先队列。堆就是优先队列的实现,很大程度的降低了时间复杂度。

另外Dijkstra算法每次找离源点最近的一个顶点也可以用堆来优化,使算法复杂度降到O((m+n)logn).具体实现见我另一篇博客堆排序实现dijsktra

用堆排序来优化prime算法见博客堆排序优化的prime算法

#includeint h[1000],n;//h是存放堆的数组,n存放堆的结点个数
void swap(int x,int y)//交换函数
{int t;t = h[x];h[x] = h[y];h[y] = t;
}
void siftdown(int a)//向下调整函数
{//传入一个需要向下调整的结点编号a, 这里传入1&#xff0c;即从堆的顶点开始向下调整 int t,flag &#61; 0;//flag用来标记是否需要继续向下调整 while(a*2 <&#61; n&&!flag){//当前结点至少得有左子结点 if(h[a] 2])//判断a和左子结点的关系&#xff0c;t记录较大结点 t &#61; a*2;elset &#61; a;if(a*2&#43;1 <&#61; n)//如果它有右子结点&#xff0c;再对右子结点进行讨论 {if(h[t] 2&#43;1])t &#61; a*2&#43;1;}if(t!&#61;a)//如果最大结点编号不是自己&#xff0c;说明子结点中有比父结点更大的 {swap(t,a);//交换他们&#xff0c;swap函数自己定义 a &#61; t;//a更新为最大结点编号&#xff0c;方便继续向下调整 }elseflag &#61; 1;//最大结点编号是自己&#xff0c;则不需要继续向下调整 }return;
}
void creat()//建立堆函数
{int i;for(i &#61; n/2; i >&#61; 1; i --)//从最后一个非叶结点到第一个结点依次向上调整 siftdown(i);return;
}
void heapsort()//堆排序
{while(n>0){swap(1,n);n--;siftdown(1);}return;
}
int main()
{int num,i;while(scanf("%d",&num)!&#61;EOF){for(i &#61;1; i <&#61; num; i &#43;&#43;)scanf("%d",&h[i]);n &#61; num;creat();//建堆 heapsort();//堆排序 for(i &#61; 1; i <&#61; num; i &#43;&#43;)//输出 printf("%d ",h[i]);printf("\n");}return 0;
}


转:https://www.cnblogs.com/hellocheng/p/7350081.html



推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • BZOJ1233 干草堆单调队列优化DP
    本文介绍了一个关于干草堆摆放的问题,通过使用单调队列来优化DP算法,求解最多可以叠几层干草堆。具体的解题思路和转移方程在文章中进行了详细说明,并给出了相应的代码示例。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
author-avatar
QEWERTGF_978
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有