[英]Max Heap Insertion and Sorting Java
我正在嘗試構建一個最大堆,隨着每個新值的插入,該值都會向上或向下移動到正確的位置,我還沒有實現向下移動功能,所以現在我正在使用一個測試,它應該只要求程序上移。 測試數據按以下順序輸入:
[16, 10, 14, 9, 7, 1, 4, 2, 8, 3]
我在主類中使用以下代碼在堆中插入值:
package com.company;
public class Main {
public static void main(String[] args) {
BinaryHeap bh = new BinaryHeap();
bh.insert(16);
bh.insert(10);
bh.insert(14);
bh.insert(9);
bh.insert(7);
bh.insert(1);
bh.insert(4);
bh.insert(2);
bh.insert(8);
bh.insert(3);
bh.printHeap();
}
}
下一段代碼是插入和移位發生的地方:
package com.company;
public class BinaryHeap {
private int[] Heap;
private int size;
private int maxsize;
public BinaryHeap(){
this.maxsize = 10;
this.size = 0;
Heap = new int[this.maxsize + 1];
}
public int Parent(int i){
return (i)/2;
}
public int LeftChild(int i){
return (2*i);
}
public int RightChild(int i){
return ((2*1)+1);
}
public void insert(int value) {
if(size <= Heap.length) {
size++;
Heap[size] = value;
siftUp(size);
}
}
private void siftUp(int i) {
int parentIndex;
int tmp;
if (i != 0) {
parentIndex = Parent(i);
if (Heap[parentIndex] < Heap[i]) {
tmp = Heap[parentIndex];
Heap[parentIndex] = Heap[i];
Heap[i] = tmp;
siftUp(parentIndex);
}
}
}
public void printHeap()
{
for (int i = 1; i < maxsize; i++) {
System.out.print(" PARENT : " + Heap[Parent(i)]
+ " LEFT CHILD : " + Heap[LeftChild(i)]
+ " RIGHT CHILD :" + Heap[RightChild(i)]);
System.out.println();
}
}
}
移位函數是 siftUp() 我認為這是問題所在。 當程序以這些輸出運行時:
PARENT : 16 LEFT CHILD : 9 RIGHT CHILD :10
PARENT : 14 LEFT CHILD : 8 RIGHT CHILD :10
PARENT : 14 LEFT CHILD : 1 RIGHT CHILD :10
PARENT : 9 LEFT CHILD : 0 RIGHT CHILD :10
PARENT : 9 LEFT CHILD : 3 RIGHT CHILD :10
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 12 out of bounds for length 11
at com.company.BinaryHeap.printHeap(BinaryHeap.java:61)
at com.company.Main.main(Main.java:20)
但這不正確,因為 1) 來自 printHeap() 函數的末尾的索引越界異常和 2) 每個父節點的子節點不在正確的位置,因為根節點應該是 16以 14 和 10 作為子代,當它打印出堆的值時,它打印出一個 0,但是 0 永遠不會插入到堆中。 我嘗試過自己進行一些調試,但沒有取得太大成功,因此歡迎對此提供任何幫助。
private void siftUp(int i) {
int parentIndex;
int tmp;
if (i != 0) { // error is this if statement
parentIndex = Parent(i);
if (Heap[parentIndex] < Heap[i]) {
tmp = Heap[parentIndex];
Heap[parentIndex] = Heap[i];
Heap[i] = tmp;
siftUp(parentIndex);
}
}
}
導致您的堆無法顯示正確數字的錯誤位於 if 語句 siftUp 中。
當您插入 16 時, Heap[1]
變為 16。然后,它調用siftUp(1)
。 在 siftUp 中,1 != 0,因此執行 if 語句。 parentIndex 變為 1/2 = 0,問題就來了。 默認情況下,Heap[0] = 0 小於 Heap[1] = 16。因此,它交換值 16 和 0,將 16 移動到索引 0,這不是您提到的頭部。 這只是錯誤的開始,隨着您插入越來越多的數字,它們會變得無處不在。
由於您的堆的根位於索引 1 處。您應該只篩選索引 1,該索引沒有 Parent。 將 if 語句更改為if(i > 1)
並修改您的 printHeap() 后,我得到了這個輸出,我認為這是正確的。 您還應該在堆中的當前索引處打印當前值。
PARENT: 0 CURRENT: 16 LEFT CHILD : 10 RIGHT CHILD : 14
PARENT: 16 CURRENT: 10 LEFT CHILD : 9 RIGHT CHILD : 7
PARENT: 16 CURRENT: 14 LEFT CHILD : 1 RIGHT CHILD : 4
PARENT: 10 CURRENT: 9 LEFT CHILD : 2 RIGHT CHILD : 8
PARENT: 10 CURRENT: 7 LEFT CHILD : 3
PARENT: 14 CURRENT: 1
PARENT: 14 CURRENT: 4
PARENT: 9 CURRENT: 2
PARENT: 9 CURRENT: 8
public void printHeap(){
for (int i = 1; i < maxsize; i++) {
System.out.print(" PARENT: " + Heap[Parent(i)]);
System.out.print(" CURRENT: "+ Heap[i]);
if(LeftChild(i) <= 10){
System.out.print(" LEFT CHILD " + ": " + Heap[LeftChild(i)]);
}
if(RightChild(i) <= 10){
System.out.print(" RIGHT CHILD "+ ": "+ Heap[RightChild(i)]);
}
System.out.println();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.