我在堆上进行了操作,这是一个修复操作。这是代码:
public class Heap {
public static void fixdown (int a[],int k,int n) {
while (2*k<=n) {
int j=2*k;
if (j<n && a[j]<a[j+1]) j++;
if (!(a[k]<a[j])) break;
swap(a,k,j);
k=j;
}
}
public static void main (String[]args) {
int a[]=new int[]{12,15,20,29,23,22,17,40,26,35,19,51};
fixdown(a,1,a.length);
for (int i=0;i<a.length;i++) {
System.out.println(a[i]);
}
}
public static void swap (int a[],int i,int j) {
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
更新:我已更改它,现在没有错误。
//结果是
12
29
20
40
23
22
17
15
26
35
19
51
答案 0 :(得分:1)
a[j]=k;
你可能想要:
a[j]=t;
请,请不要养成这样声明数组的习惯:
int x[];
您应该使用类型而不是标识符放置括号:
int[] x;
答案 1 :(得分:1)
你有a[j]=k;
也许它应该是a[j]=t;
答案 2 :(得分:0)
代码在当前的缩进状态下很难阅读,但我相信a[j]=k;
应为a[j]=t;
。
答案 3 :(得分:0)
这些行:
for (int i=0;i<a.length;i++){
System.out.println(a[i]);
建议,你的数组中的索引是基于0的。如果是这样,索引i处元素的左子项的索引应计算为
leftchild_index = 2*i+1;
rightchild_index = 2*i+2; // rightchild_index = leftchild_index + 1
a[0]
的左侧孩子为a[1]
,右侧为a[2]
如果参数n是包含堆的数组的长度,则需要修复一些条件
while(2*k<=n){
应更改为:
while(2*k + 1 < n){
和
int j=2*k;
if (j<n && a[j]<a[j+1]) j++;
应改为
int j = 2 * k + 1;
if (j < n - 1 && a[j] < a[j+1]) j++;
否则您正在访问数组越界。