起始序列为14,15,30,28,5,10,
(1)因此起始堆的情况如下:
14
15 30
28 5 10
(2)假设是打算得到一个从小到大的c,所以需要建大顶堆,起始状态从下向上建堆:
第一步: 第二步:
14 30
28 30 28 14
25 5 10 25 5 10
(3)此时已经建立完了初始的堆。此时堆顶元素30即为最大元素敏源,将堆顶元素与堆最后
一个元素进行交换,此时30是最大元素位于队尾,因此无需继续排序。所以堆如下图
所示:10 28 14 25 5
(4)此时由于除被交换到堆顶的10以外其他的都基本有序,所以自上而下建堆得到的堆
如下:
28
25 14
10 5
(5)重复(3)和(4)步骤确定了28的位置并得到堆如下:凳拿局
25
10 14
5
(6)重复(3)和(4)步骤确定了25的位置并得到堆如下:
14
10 5
(7)重复(3)和(4)步骤确定了14的位置并得到堆如下:
10
5
(8)重复(3)和(4)步骤确定了10的位置,此时只有一个数5也位于了堆的第一个位置,
因此排序完成。
扩展资料:
建堆效率
n个结点的堆,高度d =log2n。根为第0层,则第i层结点个数为2^i,考虑一个元素在堆中向下移动的距离。大约一半的结点深度为d-1,不移动(叶)。四分之一的结点深度为d-2,而它们至多能向下移动一层。树中每向上一层,结点的数目为前一层的一半,而子树高度加一。
这种算法时间代价为Ο(n)
由于堆有log n层深,插入结点、删除普通元素和删除最小元素的平均时间代价和时间复杂度都是
Ο(log n)。
*** 作实现
在程序中,堆用于动态分配和释放程序所使用的对象。在以下情况中调用堆 *** 作:
1.事先不知道程序所需对象的数量和大小。枣让
2.对象太大,不适合使用堆栈分配器。
堆使用运行期间分配给代码和堆栈以外的部分内存。
传统上, *** 作系统和运行时库随附了堆实现。当进程开始时, *** 作系统创建称为进程堆的默认堆。如果没有使用其他堆,则使用进程堆分配块。
语言运行时库也可在一个进程内创建单独的堆。(例如,C 运行时库创建自己的堆。)除这些专用堆外,应用程序或许多加载的动态链接库 (DLL) 之一也可以创建并使用单独的堆。Win32 提供了一组丰富的 API用于创建和使用专用堆。有关堆函数的优秀教程,请参阅 MSDN 平台 SDK 节点。
参考资料来源:百度百科-堆
首先这个数最少要为53,后面我帮你解答。。。。首先
每3个放一堆余2个,可以算成3a+2
每5个放一堆余3个,可以算成5b+3
每7个放一堆余4个虚圆旅,可以算成7c+4
那么这三个结果都应该表示同一个数,所以可腔哪以令三个结果相等
就是3a+2=5b+3=7c+4,那么a=(7c+2)/3,b=(7c+1)/5.
又因为a,b,c三数都是正整数,所以就可以对c取值,当c=7时就能保证a,b都能取到正整数了,那么c=7带入7c+4=53了。谢谢采纳。差凳
堆排序就是将所有待排序的元素组成一个堆,然后不断d出堆顶的元素并调用函数维持堆序,直到所有元素均被d出后,排序完成。被d出的元素序列即一个有序数列。
一般做法是这样:
当一个节点被插入时,将该节点放在堆的末尾(这是为了保证堆是完全二叉树)然后将该节点与它的父节点比较,看该节点是否大于(或小于)其父节点,即判断当前的堆是否满足堆序。如果不满足,则将该节点与其父节点交换。
再将该节点与其新的父节点做比较,依此类推,直到该节点不再需要与其父节点交换为止。(即满足堆袭则序时停止) 当一个根节点被d出(即被从堆中删除)时袜激,将堆最尾部的节点移动到头结点的位置,然后将该节点不断告禅袜与其子节点比较,如果不符合堆序则交换,直到符合堆序为止。
扩展资料:
堆的 *** 作
堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种 *** 作:
最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
创建最大堆(Build Max Heap):将堆中的所有数据重新排序
堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算
参考资料:
百度百科-堆排序
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)