堆排序中首先需要做的就是建堆,广为人知的是建堆复杂度才O(n),不过很少有人去了解过这个复杂度的证明过程,因为不是那么直观地可以一眼就看出来。 本文不讲堆排序,只单纯讲建堆过程 。 建堆代码 欲了解复杂度的计算过程,必先看懂建堆代码。先看这个建堆过程 // 将arr[n]向上调整至合适位置 void ...
分类:
其他好文 时间:
2018-02-01 14:56:19
阅读次数:
164
topK问题是指从大量数据中获取最大(或最小)的k个数,比如从全校学生中寻找成绩最高的500名学生等等. 本问题可采用小根堆解决.思路是先把源数据中的前k个数放入堆中,然后构建堆,使其保持堆序(可以简单的看成k次insert操作).然后从源数据中的第k个数据之后的每个元素与堆的根节点(小根堆得roo ...
分类:
编程语言 时间:
2017-12-24 14:43:34
阅读次数:
187
课堂练习之链表节点删除 构建堆 "堆的详细知识点" 题目:建成(最大)堆,画出完全二叉树,写出堆排序过程。{29,10,25,26,58,12,31,18,18,47} 错误回答 正确回答 ...
分类:
其他好文 时间:
2017-12-16 17:25:04
阅读次数:
185
Why? 可以保证程序在运行过程中按照实际需要申请适量的内存,使用结束后还可以释放,这种在程序运行过程中申请和释放的存储单元也称为堆对象,申请和释放的过程一般称为建立和删除。 new的功能:动态分配内存,或称为动态创建堆对象 new 数据类型(初始化参数列表) 如果内存申请成功,new运算返回一个指 ...
分类:
其他好文 时间:
2017-12-10 13:05:03
阅读次数:
115
要想明白堆排序,首先要明白堆和数组是等价的本质,还要熟悉完全二叉树的性质。 有关完全二叉树的性质 http://www.cnblogs.com/joyeehe/p/7865578.html 最大堆排序源码: 注意:假设待排序数组是a[101],此程序,对索引1到101的单元排序,不处理a[0],因为 ...
分类:
编程语言 时间:
2017-11-20 23:21:14
阅读次数:
161
数据结构课程学位考试试题(参考答案在题后) 判断题:判断下列各小题叙述的正误。对,在题号后的括号内填入“√ ”;错,在题号后填入“ ×”。 1、数据的最小单位是数据项。………………………….( √) 2、多重表文件中主索引为非稠密索引,次索引为稠密索引。……….( √ ) 3、通常数据结构在计算机中... ...
分类:
其他好文 时间:
2017-10-30 14:44:51
阅读次数:
186
堆排序过程: 主函数中: public void main(String[] args)1. 定义初始化数组:int[] a = new int[]{.............}2. 循环建堆 调用建堆函数: for (int i = 0; i < a.length - 1; i++) { buil ...
分类:
编程语言 时间:
2017-10-18 21:44:41
阅读次数:
288
在算法导论第三版中介绍“堆排序是一种原地排序,如果试图引入数组,那么将失去这一优势。”堆排序的基础是在原有堆上进行排序,即将等待排序的集合先建堆 1.建立最大堆(Max_Heapify) 最大堆满足条件A[Parent[i]]>=A[i] 最大堆唯一能确立的就是数组中的最大元素,相当于一个复杂的Ma ...
分类:
编程语言 时间:
2017-10-12 13:08:09
阅读次数:
162
今天早上起来完成了一个完整的基于二叉堆实现的优先队列,其中包含最小优先和最大优先队列。 实际上上篇也说了优先队列的特性,通过建堆和堆排序操作,我们就已经看到了这种数据结构中的数据具有某种优先级别,要么非根节点大于他的子节点,要么就相反,在最大优先队列中最大优先级别就是指节点值最大的数据为根节点,每次 ...
分类:
其他好文 时间:
2017-09-26 10:06:11
阅读次数:
241