当前位置: 首页 > 知识库问答 >
问题:

如何在Java中创建数组的堆排序方法?

沃瑾瑜
2023-03-14

我知道Stack Overflow上有无数的HeapSort方法,但是没有一个方法一定能帮助我完成我正在做的事情。

我有点想法什么是堆,我只是不知道如何获取这些值并将它们分类以将它们存储到数组中。

因此,我的指令如下:静态堆排序(Comparable[],int)方法应该对数组执行“就地”排序(从最低值到最高值)。第二个参数指示数组中填充元素的数量。若要“将 [数组] 本身视为最大堆”,此方法可以创建一个本地 MaxHeap优先级队列实例,并将第一个参数分配给 elementData,将第二个参数分配给大小。由于数据从索引 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];
    }
}

这个算法是建立在我的笔记上的,但是我主要纠结于我在这个方法的第一行注释的内容。我提供了与这个方法相关的另外两个类。我也有其他的方法,但是正如我之前在指令中提到的,父类,左类,右类,等等。不会被使用。然而,有人提到尝试创建两个私有的helper方法,比如私有的E removeSort()和私有的void bubbleDown(int index)方法。

共有2个答案

戴霖
2023-03-14

这就是它。

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();
    }
}
龚凯泽
2023-03-14

在修订版1中,您尝试将某些内容分配给PriorityQueue

从修订版 2 开始,最大堆优先级队列(a, size) 不执行“就地”排序。没有类与堆排序(a,大小)绑定

 类似资料:
  • 问题内容: 由于Java泛型的实现,因此不能有以下代码: 如何在保持类型安全的同时实现此目的? 我在Java论坛上看到了这样的解决方案: 但是我真的不知道发生了什么。 问题答案: 我不得不问一个问题:您的GenSet“已选中”还是“未选中”?那是什么意思? 检查:强打字。GenSet明确地知道什么类型的包含对象(即它的构造是明确要求有Class 参数,当他们通过了类型不是参数的方法会抛出异常E。见

  • 我试图创建一个由子类定义的对象数组(我认为这是正确的术语)。我可以看到这个问题反复出现,但实现仍然存在问题。 我的代码 给出错误 线程“main”java.lang.NullPointerException中出现异常。 为了使其合理化,我将其分解为最简单的术语: 这似乎奏效了。我只是看不出我的两个例子有什么不同。我知道我的第一个没有意义,但是MyClass最终会包含更多的数据。) 我很肯定这个问题

  • 我正在做算法的中期审查,我试图用Java实现所有的伪代码,以便更好地理解算法。但是在堆排序部分,我的代码有一些问题。我的输入数组是 {10,16,4,10,14,7,9,3,2,8,1} 第一个元素只是表示我想要排序的元素的数量。换句话说,需要排序的元素从索引1开始。 我的build max heap输出是:16 14 10 8 7 9 3 2 4 1 堆排序的输出是:1 3 2 4 7 8 9

  • 本文向大家介绍堆排序实例(Java数组实现),包括了堆排序实例(Java数组实现)的使用技巧和注意事项,需要的朋友参考一下 堆排序:利用大根堆 数组全部入堆,再出堆从后向前插入回数组中,数组就从小到大有序了。 堆排序:对数组进行构造堆(最大堆) 以上这篇堆排序实例(Java数组实现)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 我正在为学校进度设计基于文本的冒险游戏。我将每个“级别”设置为一个类,并将每个可探索区域(节点)设置为相应类中的一个方法。 困扰我的是从一个节点移动到另一个节点的代码。由于每个节点最多连接四个其他节点,因此我必须在每种方法中重复一个极为相似的代码块。 我更愿意做的是在每个节点的开头包含一个方法数组,如下所示: 然后将该数组发送到通用方法,然后将播放器发送到正确的节点: 我简化了代码,但

  • 我有一个JSON数组: 结果为“数据”: 我怎么能有一个升序按“datesurder”? THX