寻求有关堆数据结构实现的帮助

时间:2010-05-28 16:00:15

标签: java algorithm arrays

我在堆上进行了操作,这是一个修复操作。这是代码:

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

4 个答案:

答案 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++;

否则您正在访问数组越界。