我只是想看看我是否理解教授和在线资源所说的话。
对于heapSort算法,第一个元素的索引从0开始。
对于最大堆,如果子堆大于父堆,则percolate down应将最大子堆与其父堆交换,例如(这是用于赋值,因此我尝试发布尽可能少的代码):
def percolateDownMaxHeap( array, hole, length):
while hole * 2 < size - 1:
left = 2*hole + 1
right = left + 1
max = left
if (left < size - 1) and (array[right] > array[left]):
max = right
if (array[max] > array[hole]):
swap(array, hole, max)
else:
break
hole = max
所以最后,最大元素应该在索引0处。
如果这是正确的,我不理解的是heapSort实现:
def heapSort(array):
i = len(array) / 2
while i >= 0:
percolateDownMaxHeap( array, i, len(array))
i -= 1
i = len(array) - 1
while i > 0:
swap( array, 0, i );
percolateDownMaxHeap( array, i, len(array))
i -= 1
最大堆中的渗滤层不应该将最大的元素放在索引0处吗?在这种情况下,为什么不在最小堆上使用渗滤液呢?代码可以工作,但我不确定是否正确,或者是否实现了最大堆而不是最小堆
谢谢
在最大堆中渗透不是应该把最大的元素放在索引0吗?
确实如此。然后,代码将其交换到堆之外,因此每次连续交换都会将下一个最大的元素放在它所属的位置。
在这种情况下,为什么不在最小堆上使用渗滤?
这将使min元素处于正确的位置,但堆在数组中仍然需要该位置,因此不清楚下一个元素应该做什么。
我在[17,98,89,42,67,54,89,25,38]中有一个数字列表,从左到右插入到一个空堆中。生成的堆是什么?
对于堆排序,如果我们想按升序对数组排序,那么应该在最大堆还是最小堆中转换堆?
我注意到一件非常奇怪的事情。 读完这节课后,我在C中实现了一些堆排序代码。 代码如下。 奇怪的是,对我来说,构建min堆-提取min(或在构建min堆后在根目录下执行min-heapify)应该按升序进行。然而,在执行此代码并打印出结果向量后,我得到: 在试图弄清楚发生了什么的时候,我改变了 到 最终选择较大(或最大)的父节点和子节点,得到的向量为: 我是否做错了什么,或者我对堆/堆排序的理解不清
本文向大家介绍C语言实现基于最大堆和最小堆的堆排序算法示例,包括了C语言实现基于最大堆和最小堆的堆排序算法示例的使用技巧和注意事项,需要的朋友参考一下 堆定义 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2](小顶堆)或者:Key[i]>=Key[2i+1]&&key>=key[2i+2](大顶堆) 即任何一非叶节点的关
我试图构造一个最大堆,当插入每个新值时,值会上移或下移到正确的位置,我还没有实现下移函数,所以现在我正在使用一个测试,该测试应该只需要程序上移。测试数据按以下顺序输入: [16, 10, 14, 9, 7, 1, 4, 2, 8, 3] 我在主类中使用以下代码在堆中插入值: 下一位代码是插入和移位的地方: 移位函数是siftUp(),我认为这就是问题所在。当程序以这些输出运行时: 但这是不正确的,
以下是完整的问题: 编写一个java方法,它将接受两个排序后的堆栈a和B(最小值在顶部),并返回一个排序后的堆栈D(最小值在顶部)。只允许使用堆栈操作,如pop、push、isEmpty和peek。 示例:假设A={(top)1,4,7,9}和B={(top)2,3,6},那么函数将返回一个新的堆栈D={(top)1,2,3,4,6,7,9} 我写的代码是这样的: 你怎么认为?