Java minheap按什么顺序排序?

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

我一直在阅读关于minHeap和maxHeap的各种定义。我偶然发现这样的说法:

  • minHeap用于按降序排序
  • maxHeap用于按升序排序
  • 从中的“说明”中摘取的声明。 但是,当我在Java中使用带有默认比较器的
    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…签出此中的“注意事项”,请直接在您的问题中提供该信息