Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何解决堆排序问题并将其表示为数组_Algorithm_Sorting_Heap_Heapsort - Fatal编程技术网

Algorithm 如何解决堆排序问题并将其表示为数组

Algorithm 如何解决堆排序问题并将其表示为数组,algorithm,sorting,heap,heapsort,Algorithm,Sorting,Heap,Heapsort,我需要一些帮助来解决这个希普索尔问题。我觉得这很简单,但我想看看你们能得到什么来检查我的答案 请检查我下面的工作!:) 对不起,你的答案不对 为什么您的答案是错误的:一般来说,您不能交换堆中的元素,因为堆具有基本不变量,即给定节点中的元素总是大于其子节点中的元素(或者总是较小,如果它是最小堆而不是最大堆;但问题中的堆是最大堆)。在您的答案中,您将采用最大堆并交换元素,直到它成为最小堆;但是你是不允许这样做的,这不是问题所在 事实上,问题有点不清楚——“排序堆”不是一个标准术语,但我认为它要求您做

我需要一些帮助来解决这个希普索尔问题。我觉得这很简单,但我想看看你们能得到什么来检查我的答案

请检查我下面的工作!:)


对不起,你的答案不对

为什么您的答案是错误的:一般来说,您不能交换堆中的元素,因为堆具有基本不变量,即给定节点中的元素总是大于其子节点中的元素(或者总是较小,如果它是最小堆而不是最大堆;但问题中的堆是最大堆)。在您的答案中,您将采用最大堆并交换元素,直到它成为最小堆;但是你是不允许这样做的,这不是问题所在

事实上,问题有点不清楚——“排序堆”不是一个标准术语,但我认为它要求您做的是以下第二部分:

  • heapsort的这一部分通过从堆中移除根元素(即最大的元素)并将其放在数组的末尾,然后移除新的根元素并将其放在倒数第二的位置,依此类推,直到堆为空。因此,您应该显示“23”被移除(“17”和“16”被向上撞击,而“1”被移走),然后“17”被移除(“16”和“8”被向上撞击,而“1”被移走),等等,确保始终保持最大堆,并且堆的最后一行始终从左到右完全填充
  • 您已经正确理解了堆的数组表示形式,因此我将不深入讨论,只需注意,每次从堆中移除一个元素时,堆所覆盖的数组元素比以前少了一个;具体地说,它不再覆盖需要将heap元素放入的确切数组元素。所以heapsort不需要额外的数组或任何东西;堆将缩小,数组的已排序部分将增长,直到堆为空且整个数组已排序
  • 请注意,heapsort在您被要求执行的操作之前还有一个步骤,其中数组被“heapified”以创建要开始的堆。在您的问题中,这显然已经完成了—您得到了堆—所以您只需要担心第二部分,即将元素移出堆

或者,也许您是对的,它希望您将树(在这种情况下实际上不是“堆”)转换为最小堆。这就是“heapify”操作,它是heapsort的第一部分。在这种情况下,确实需要交换元素;但您只能将元素与其直接父元素或子元素交换,而不仅仅是任意元素。(在这种情况下,您不需要对整个问题进行排序;只需满足最小堆不变量即可。)但我不认为这是您的问题要求您做的。

您的问题是什么?我的问题是如何解决此堆排序问题并将其表示为一个数组我现在明白了,谢谢@RyanMonahan如果是你的答案,请将其标记为答案,这样可以帮助其他人解决同样的问题。@RyanMonahan:不客气!