如何在 Java 中使用 Heap 编写 bubbleDown 方法?
How to write a bubbleDown method with Heap in Java?
我知道有几个这样的问题张贴在整个堆栈溢出中,但是 none 确实回答了我的问题。我正在编写一个辅助私有 bubbleDown 方法来帮助我对 public 静态 HeapSort 方法进行排序。
我知道这个想法是将 a 本身视为最大堆,其数据从 0(而不是 1)开始。
- a 实际上不在堆顺序中。
- 但是如果你重复"bubble down"每个非叶节点,从最后一个开始,你最终会有一个合适的堆。
我已经编写了这个算法,但是我不确定它是否真的有效。
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;
}
}
}
现在一切似乎 运行 更顺利了,只是当我有重复值时,它们没有正确排序。我没能在我的气泡方法中找到这个错误。
这是我得到的
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;
}
}
}
我知道有几个这样的问题张贴在整个堆栈溢出中,但是 none 确实回答了我的问题。我正在编写一个辅助私有 bubbleDown 方法来帮助我对 public 静态 HeapSort 方法进行排序。
我知道这个想法是将 a 本身视为最大堆,其数据从 0(而不是 1)开始。
- a 实际上不在堆顺序中。
- 但是如果你重复"bubble down"每个非叶节点,从最后一个开始,你最终会有一个合适的堆。
我已经编写了这个算法,但是我不确定它是否真的有效。
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;
}
}
}
现在一切似乎 运行 更顺利了,只是当我有重复值时,它们没有正确排序。我没能在我的气泡方法中找到这个错误。
这是我得到的
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;
}
}
}