Java 正在寻找有关堆数据结构实现的帮助

Java 正在寻找有关堆数据结构实现的帮助,java,algorithm,arrays,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;

我有一个堆上的操作,一个修复操作。代码如下:

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;
    }
}
a[j]=k

您可能想要:

a[j]=t


关于数组声明 请不要养成这样声明数组的习惯:

int x[];
您应该将括号与类型而不是标识符放在一起:

相关问题
    • 这些声明会导致
      i
      的不同类型

    • 你有
      a[j]=k


      也许它应该是
      a[j]=t

      在当前缩进状态下,代码很难读取,但我相信
      a[j]=k;
      
      应该是
      a[j]=t

      这些行:

      for (int i=0;i<a.length;i++){
       System.out.println(a[i]);
      
      a[0]
      的左边子级是
      a[1]
      ,右边子级是
      a[2]

      如果参数n是包含堆的数组的长度,则需要修复一些条件

      while(2*k<=n){
      

      while(2*k查看fixdown,看看它在这一个值上做了什么。这是单元测试的一个很好的用途。我建议使用更多描述性变量名。这将帮助您避免一些小错误Lygene润滑剂请查看我的输出,我确信它是正确的,但您可以建议我或检查吗?关于:数组-我个人使用
      类型[]ident;
      对于我的声明,我确实看到有人引用它是“约定”,您是否愿意详细说明它背后的原理?我碰巧是以“正确的方式”选择它的,但我看不出阻止它的逻辑原因。您也可以将right描述为rightchild=leftchild+1^^
      for (int i=0;i<a.length;i++){
       System.out.println(a[i]);
      
      leftchild_index = 2*i+1;
      rightchild_index = 2*i+2; // rightchild_index = leftchild_index + 1
      
      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++;