Java minheap按什么顺序排序?
我一直在阅读关于minHeap和maxHeap的各种定义。我偶然发现这样的说法:Java minheap按什么顺序排序?,java,algorithm,sorting,data-structures,heap,Java,Algorithm,Sorting,Data Structures,Heap,我一直在阅读关于minHeap和maxHeap的各种定义。我偶然发现这样的说法: minHeap用于按降序排序 maxHeap用于按升序排序 从中的“说明”中摘取的声明。 但是,当我在Java中使用带有默认比较器的PriorityQueue实现minHeap时,我得到了最小的元素。为什么呢? 感谢所有想帮忙的人:)。博客中的解释是正确的 在仔细查看heapSort()函数的同时,它巧妙地利用了min-heap。数组中最小的元素将替换为最后一个元素,堆的大小将减少1,再次heapify()it a
PriorityQueue
实现minHeap时,我得到了最小的元素。为什么呢?
感谢所有想帮忙的人:)。博客中的解释是正确的 在仔细查看
heapSort()
函数的同时,它巧妙地利用了min-heap。数组中最小的元素将替换为最后一个元素,堆的大小将减少1,再次heapify()
it
arr[0]
->表示最小的元素
在每次迭代中,对于
i
从n-1
到0
,arr[0]与arr[i]
交换,堆再次被重设为比上一次迭代小1的大小。博客中的解释是正确的
在仔细查看heapSort()
函数的同时,它巧妙地利用了min-heap。数组中最小的元素将替换为最后一个元素,堆的大小将减少1,再次heapify()
it
arr[0]
->表示最小的元素
在每次迭代中,对于
i
从n-1
到0
,arr[0]与arr[i]
交换,堆再次被堆化,大小比上一次迭代小1。基本思想是在适当的位置进行排序。每次算法从堆中轮询时,堆的大小都会缩小1。因此,数组末尾的一个位置不再是堆的一部分。在这个索引中,第n个最小的数字被放置
// One by one extract an element from heap
for (int i = n - 1; i >= 0; i--) {
// Move current root to end
swap(arr[0], arr[i]);
// call max heapify on the reduced heap
heapify(arr, i, 0);
}
因此,使用
PriorityQueue
的算法行为异常的原因是使用单独的数组作为输出。您可以切换到最大堆并坚持您的方法,也可以反向填充输出数组。两者应该产生相同的行为。基本思想是在适当的位置进行排序。每次算法从堆中轮询时,堆的大小都会缩小1。因此,数组末尾的一个位置不再是堆的一部分。在这个索引中,第n个最小的数字被放置
// One by one extract an element from heap
for (int i = n - 1; i >= 0; i--) {
// Move current root to end
swap(arr[0], arr[i]);
// call max heapify on the reduced heap
heapify(arr, i, 0);
}
因此,使用
PriorityQueue
的算法行为异常的原因是使用单独的数组作为输出。您可以切换到最大堆并坚持您的方法,也可以反向填充输出数组。两者应产生相同的行为。最小堆和最大堆不排序。您可以使用最小堆或最大堆进行排序,但在标准使用中,堆不会被排序。相反,它们按所谓的堆顺序排列。这种安排使添加项和删除最小项(或最大项)变得高效,同时保持数据的正确顺序
例如,下面是最小堆的示例:
1
3 2
4 7 6 5
这遵循一条规则,即没有子对象比其父对象大。该堆的结果数组表示为[1,3,2,4,7,6,5]
。请注意,还有其他具有相同数字的有效堆。例如,以下两项也是有效的:
1 1
2 5 2 3
4 3 6 7 4 5 6 7
相应的数组表示为[1,2,5,4,3,6,7]
和[1,2,3,4,5,6,7]
最大堆与此类似,只是规则是子堆不能大于其父堆
政府对此解释得很好
现在,当您谈论使用堆排序时,您将构建一个堆,然后重复地将根元素与数组中的最后一个元素交换,减少计数,然后重新heapify。因此,从后向前构建排序数组。如果使用最小堆,则根(最小值)将位于数组的末尾
因此,如果您想使用堆排序按降序排序,可以使用最小堆。最小堆和最大堆不排序。您可以使用最小堆或最大堆进行排序,但在标准使用中,堆不会被排序。相反,它们按所谓的堆顺序排列。这种安排使添加项和删除最小项(或最大项)变得高效,同时保持数据的正确顺序 例如,下面是最小堆的示例:
1
3 2
4 7 6 5
这遵循一条规则,即没有子对象比其父对象大。该堆的结果数组表示为[1,3,2,4,7,6,5]
。请注意,还有其他具有相同数字的有效堆。例如,以下两项也是有效的:
1 1
2 5 2 3
4 3 6 7 4 5 6 7
相应的数组表示为[1,2,5,4,3,6,7]
和[1,2,3,4,5,6,7]
最大堆与此类似,只是规则是子堆不能大于其父堆
政府对此解释得很好
现在,当您谈论使用堆排序时,您将构建一个堆,然后重复地将根元素与数组中的最后一个元素交换,减少计数,然后重新heapify。因此,从后向前构建排序数组。如果使用最小堆,则根(最小值)将位于数组的末尾
因此,如果您想使用堆排序按降序排序,您可以使用最小堆。您从哪里引用?最小堆的概念是有效地访问最小值,重复这样做似乎不会导致升序。@Yunnosch…签出此中的“注意事项”请直接在您的问题中提供该信息,不要把它藏在这里的评论中。@Yunnosch Done.你知道哪一个是正确的吗?我读了链接,你似乎引用/总结正确。我期待着看到一个解释。你从哪里引用?最小堆的思想是有效地访问最小值,重复这样做似乎不会导致升序。@Yunnosch…签出此中的“注意事项”,请直接在您的问题中提供该信息