本文介绍: 如果排升序建立小堆,我们可以一开始获取最小的数字,但是我们下一步呢,如果找第二小的数字?如果要找第二个最小的数字,如果在当前这个堆的基础上找,那么关系全乱了,因为要在兄弟之间,要在父亲的兄弟之间,父亲的兄弟的孩子之间找这时候只能重新建一个堆,但是建堆的代价是时间复杂度的重复性。所以,使用大堆来解决堆排序的升序问题! 根据,堆删除的一种思想,交换!根结点元素和尾结点元素的交换,以大堆的父结点元素比子结点元素大的特点,最后一个结点的元素是堆的最小值,而根结点的元素是堆的最大值,当二者进行交换后,最小值跑到了根结
堆的意义:
第一是堆的排序,第二是堆的top k 排行问题
堆排序的实现:——以升序为例
方法一 交换首尾:
建立大堆:
根结点尾结点的交换配合自上而下的操作:
自上而下的函数 :
自下而上的函数:
源文件:
主函数部分:
方法二 反复横跳:
实现:
top K 排行问题:— 以处理较多数据为例,最大的前K个数
创建数据并存储到文件中:
创建K个数的小堆:
进行交换:
打印堆:
完整代码:
自上而下调整的时间复杂度:
自下而上调整的时间复杂读:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。