本文介绍: 如果排升序建立小堆我们可以一开始获取最小数字,但是我们一步呢,如果找第二小的数字?如果要找第二个最小数字,如果在当前这个堆的基础上找,那么关系全乱了,因为要在兄弟之间,要在父亲的兄弟之间,父亲的兄弟的孩子之间找这时候只能重新建一个堆,但是建堆的代价是时间复杂度重复性。所以,使用大堆解决堆排序的升序问题! 根据,堆删除的一种思想,交换!根结点元素和尾结点元素交换,以大堆的父结点元素比子结点元素大的特点,最后一个结点元素是堆的最小值,而根结点的元素是堆的最大值,当二者进行交换后,最小值跑到了根结

目录

 堆的意义: 

第一是堆的排序,第二是堆的top k 排行问题

堆的 top k 排行问题:

面对大量数据的top k 问题:

 堆排序的实现:——以升序为例

方法一  交换首尾: 

建立大堆:

根结点尾结点的交换配合自上而下的操作:

自上而下的函数 :

自下而上的函数:

源文件: 

主函数部分:

方法二  反复横跳: 

实现: 

top K 排行问题:— 以处理较多数据为例,最大的前K个数

创建数据并存储到文件中: 

创建K个数的小堆: 

 进行交换:

打印堆: 

完整代码: 

自上而下调整的时间复杂度:

自下而上调整的时间复杂读: 

 


 堆的意义: 

第一是堆的排序,第二是堆的top k 排行问题

堆的 top k 排行问题

面对大量数据top k 问题

再面对大量的数据时,如果要进行排列k最小数值时,可以创建一个拥有K个结点大小小堆,随后再进行插入,将插入数据栈顶元素进行比较,如果比栈顶元素小,那么替换栈顶元素,随后再和栈顶下的各个结点进行比较交换

这种做法到最后,形成了一种栈顶是最小的元素的结果,这种方法也相当于是一种末位淘汰制。 

 堆排序实现:——以升序为例

如果排升序建立小堆,我们可以一开始获取最小的数字,但是我们一步呢,如果找第二小的数字?

如果要找第二个最小的数字,如果在当前这个堆的基础上找,那么关系全乱了,因为要在兄弟之间,要在父亲的兄弟之间,父亲的兄弟的孩子之间

时候只能重新建一个堆,但是建堆的代价是时间复杂度重复性。

所以,使用大堆解决堆排序的升序问题

方法一  交换首尾: 

 根据,堆删除的一种思想,交换

根结点元素和尾结点元素的交换,以大堆的父结点元素比子结点元素大的特点,最后一个结点的元素是堆的最小值,而根结点的元素是堆的最大值,当二者进行交换后,最小值跑到了根结点位置最大值跑到了最尾部结点。

而此时,使用循环方法结合屏蔽尾部结点的方法,在轮流交换过程下,很快就会形成一个以大堆的基础构建的小堆,而小堆在数组中的排序便是升序的! 

建立大堆

使用之前构建堆的方法过于繁琐,所以可以利用现成数组和自下而上的交换方法进行大堆的建立 

根结点尾结点的交换配合自上而下的操作

– –end用来屏蔽一会的最尾结点,end下标的意思,n是数组大小的意思。

 

自上而下的函数

自下而上的函数

源文件: 

函数部分

方法二  反复横跳: 

反复横跳的核心找到最后一个结点的父节点,进行自上而下的交换,利用升序和大堆的特点——父结点比子结点大,将父结点的元素和子结点的元素进行交换。

实现: 

i  表示为父结点的下标,n一开始是最尾部结点的下标 


top K 排行问题:— 以处理较多数据为例最大的前K个数

 在之前上文堆的意义中,详细讲过了堆的top k问题,而这里处理较多数据top k 为例

创建数据存储文件中: 

一步主要是怕数据过多导致终端卡顿 

file指向文件指针fin是文件内部进行内容操作指针 

 

创建K个数的小堆: 

  •  根据小堆的特点,根部是堆中最小的数字,如果需要寻找最大的数,则可以通过堆顶的根结点元素进行第一道排查
  • 而比堆顶大的数则替换堆顶元素,随后根据小堆的特点,父结点比子结点小,从而进行自上而下的交换,把较大的元素丢到堆的尾部进行二次的排查
  • 这样到最后最后一个结点是最大的数,而堆顶的根结点元素则是这一千万个数种第K个最大的数。

 进行交换:

因为fscanf读完数据后会返回EOF,所以 以此作为判定条件x用来寄存从文件中读取的元素,当x比堆顶根结点元素大时,替换堆顶根结点元素,随后进行自上而下的交换进行调整堆的元素,以此维持小堆结构 

打印堆: 

 

完整代码: 


自上而下调整的时间复杂度

自下而上调整的时间复杂读: 


 

原文地址:https://blog.csdn.net/2301_76445610/article/details/134699288

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_36320.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注