如何在 Java 中为数组创建 HeapSort 方法?

Posted

技术标签:

【中文标题】如何在 Java 中为数组创建 HeapSort 方法?【英文标题】:How to create a HeapSort method to an array in Java? 【发布时间】:2019-09-29 09:37:42 【问题描述】:

我知道 Stack Overflow 上有无数的 HeapSort 方法,但没有一个能帮助我完成我的工作。

我有点了解堆是什么,我只是不知道如何获取这些值并将它们排序以将它们存储到数组中。

因此,我的指令是:静态 heapSort(Comparable[], int) 方法应该对数组执行“就地”排序(从最低值到最高值)。第二个参数表示数量 填充数组中的元素。为了“将 [数组] 本身视为一个最大堆”,此方法可以创建一个本地 MaxHeapPriorityQueue 实例,并将第一个参数分配给 elementData,将第二个参数分配给 size。因为数据从索引 0 开始,您可能无法使用大多数其他私有帮助方法。当方法完成后,数组参数将被排序。

public class MaxHeapPriorityQueue<E extends Comparable<E>>

private E[] elementData;
private int size;

@SuppressWarnings("unchecked")
public MaxHeapPriorityQueue()

    elementData = (E[]) new Comparable[10];
    size = 0;

public static void heapSort(Comparable[] a, int size)


MaxHeapPriorityQueue elementData = new MaxHeapPriorityQueue();
//PriorityQueue<Comparable> pq = new PriorityQueue();

    for (Comparable n : a)
    
        elementData.add(n);
    
    for (int i = 0; i < size; i++)
    
        a[i] = elementData.remove();
    

public class MHPQIterator implements java.util.Iterator<E>

    private int index;

    public boolean hasNext()
    
        if(size == 0)
        
            return false;
        
        else
        
            return (index < size);
        
    
    public E next()
    
        index++;
        return elementData[index];
    

这个算法是建立在我的笔记上的,但是我主要是在努力解决我在方法第一行的评论。我提供了与此方法相关的另外两个类。我也有其他方法,但正如我在前面的说明中所述,不会使用 parent、leftChild、rightChild 等。然而,有人提到尝试创建两个私有辅助方法,例如私有 E removeSort() 和私有 void bubbleDown(int index) 方法。

【问题讨论】:

您的“说明”措辞不是我所期望的。 MaxHeapPriorityQueue 是不是众所周知? “实例”如何分配“参数”?什么是“ 其他私有辅助方法”? Floyd's variation 逐一插入项目。也就是说,我发现 Java 的泛型性很笨拙。 @greybeard 详细点,我不知道那是什么意思。 (在revision 2 中,我在方法的第一行中评论的内容由于缺少该评论而相当神秘。) 当引用源代码中的名称时,将它们放在`“反引号”中会很明显。我发现装饰像leftChild()这样的方法成员很有帮助。 【参考方案1】:

在revision 1 中,您尝试将某些内容分配给PriorityQueue&lt;&gt;假设这是java.util.PriorityQueue&lt;&gt;,没有(Java)方法可以工作,除非某些东西是扩展java.util.PriorityQueue&lt;&gt;的类: 即使是since 1.5,他们也搞砸了,没有指定接口,而是指定了一个类。


截至revision 2,MaxHeapPriorityQueue.heapSort(a, size)执行an "in-place" sort。没有类 heapSort(a, size).

【讨论】:

哦,好吧,但是你对那条线有什么建议,因为如果我弄清楚了那条线,我可以找出整个算法来完成它。 好吧,我在上面编辑了我的代码,我注释掉了我之前使用的一行,但是我现在唯一的问题就是让它全部排序算法。 我获得了两个私有辅助方法,例如私有 E removeSort() 和私有 void bubbleDown(int index) 方法。我仍然不确定如何使用它们,但如果我对它们有疑问,我会问一个问题。到目前为止,当我运行测试时,它只是说它没有排序。【参考方案2】:

就是这样。

public static void heapSort(Comparable[] a, int size)

    MaxHeapPriorityQueue mhpq = new MaxHeapPriorityQueue();
    mhpq.elementData = a;
    mhpq.size = size;

    for (int i = (size/2)-1; i >= 0; i--)
    
        mhpq.bubbleDown(i);
    
    for(int i = size-1; i >= 0; i--)
    
        a[i] = mhpq.sortRemove();
    

【讨论】:

以上是关于如何在 Java 中为数组创建 HeapSort 方法?的主要内容,如果未能解决你的问题,请参考以下文章

在java中,如何在int数组中为该数组中的另一个值添加值?

堆排序(Heapsort)

堆排序-HeapSort

如何在 MFC 中为 CSocket 创建一个套接字数组?

原始数组如何在Java中为每个循环使用new?

如何在 JSTL 中为数组指定 useBean 标签