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

如何用Java写一个带堆的bubbleDown方法?

和丰羽
2023-03-14

我知道有几个类似这样的问题贴满了堆栈溢出,但没有一个真正回答我的问题。我正在编写一个helper-private bubbleDown方法来帮助我对公共静态HeapSort方法进行排序。

我知道这样做的目的是将自身视为最大堆,其数据从0(而不是1)开始。

  • a实际上不是按堆顺序排列的。
  • 但是如果你反复“冒泡”每个非叶子节点,从最后一个开始,你最终会有一个合适的堆。

我已经写了这个算法,但我不确定这是否真的有效。

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 mhpq = new MaxHeapPriorityQueue();
    mhpq.elementData = a;
    mhpq.size = size;
    for (Comparable n : a)
    {
        mhpq.bubbleDown((int) n);
    }
    for (int i = 0; i < a.length-1; i++)
    {
        a[i] = mhpq.sortRemove();
    }
}
private void bubbleDown(int index)
{
    boolean found = false;
    while(!found)
    {
        int leftIndex = lChild(index);
        int rightIndex = rightChild(index);
        int largestChildIndex = leftIndex;

        if(hasRChild(index))
        {

     if(elementData[leftIndex].compareTo(elementData[rightIndex]) < 0 )
     {
        largestChildIndex = rightIndex;
     }
}
        if(hasLChild(index))
        {

   if(elementData[largestChildIndex].compareTo(elementData[index]) > 0)
            {
                swap(elementData, largestChildIndex , index);
                index = largestChildIndex;
            }
            else
            {
                found = true;
            }
        }
        else //Probably a leaf
        {
            found = true;
        }
    }
}

现在一切似乎都运行得更顺利了,只是当我有重复的值时,它们没有正确排序。我在泡泡法中找不到这个错误。

共有1个答案

孔砚
2023-03-14

这是我得到的

private void bubbleDown(int index)
{
    boolean found = false;
    while(!found && (2*index +1) < size)
    {
        int left = leftChild(index) + 1;
        int right = rightChild(index) + 1;
        int child = left;

        if((index*2 +2) < size && elementData[right].compareTo(elementData[left]) > 0)
        {
            child = right;
        }
        if(elementData[index].compareTo(elementData[child]) < 0)
        {
            swap(elementData, index, child);
            index = child;
        }
        else
        {
            found = true;
        }
    }
}
 类似资料:
  • 问题内容: 嗨,我正在尝试使用另一个空堆栈反转堆栈(我自己编写了一个堆栈)。由于某种原因,它无法正常工作。谁能帮我这个 ? 问题答案: while(!stack1.isEmpty()){ Integer value = (Integer)stack1.pop(); System.out.println(value); reverse.push(value); }

  • 我想写一个带有参数的异步方法,如下所示: 如何在中执行此操作?

  • 大家好,所以我想编写一个代码来执行以下操作:java方法,它将获得两个排序的堆栈a和B(最小值),并返回一个排序的堆栈D(最小值)。您只允许使用堆栈操作,如pop、push、isEmpty和PEEK。示例:假设a={(top)1,4,7,9},b={(top)2,3,6},那么函数将返回一个新堆栈d={(top)1,2,3,4,6,7,9} 但这对我不起作用:(这是代码,我已经准备好接受任何建议

  • 今天,在我的面试中,一个面试官让我写一个单件课。我的回答是 突然,他告诉我这是写这门课的老方法。有谁能告诉我他为什么那样说。

  • 本文向大家介绍如何用Java编写一个空函数,包括了如何用Java编写一个空函数的使用技巧和注意事项,需要的朋友参考一下 让我们看看如何在Java中编写一个空函数- 示例 输出结果 空函数基本上是在不定义函数的情况下创建函数的。名为Demo的类包含一个名为'my_empty_fun'的空函数,该函数只需放置两个花括号即可完成,而无需添加任何功能。在main函数中,编写了一条print语句,然后调用e

  • 问题内容: 当我发现以下代码在没有警告和打印的情况下进行编译时,我感到非常惊讶: 我预期会有编译错误。 编译该代码是否有原因? 确保参数具有相同类型的正确方法是什么? 编辑: 关于有限类型参数呢?我能想到的最好的是: 不幸的是,java不允许循环约束。不编译。这是死胡同吗? 问题答案: 究其原因,这是编译因为Java会推断出参数的最具体的超传入,在这种情况下,后是盒装,以和为传递。 没有泛型: 即