繁体   English   中英

2D数组单行排序

[英]2D array single row sorting

我正在尝试通过java用2D数组实现流行的霍夫曼编码算法。

这个想法是创建这个2D数组,将输入的概率排序并插入到数组的第一行中,然后接下来的每一行中的第一个元素将是上一行中前2个元素的总和。

然后对当前行进行排序,然后继续进行下一行。

不幸的是,我在2D数组中的各个行的排序中看到了一个奇怪的输出。 这是代码。

   import java.util.Scanner;
   public class SolaihtheHuffman {
    public static void main(String[] args) {
     Scanner input=new Scanner(System.in);
     System.out.println("Please enter the number of letters.");
     int numberofletters=input.nextInt();
     float [][] grandoverseer=new float[numberofletters][numberofletters];

     float [] probabilities = new float [numberofletters];

     System.out.println("Please enter each letter's probability.");
     for(int x=0;x<numberofletters;x++){
        probabilities[x]=input.nextFloat();
     }




    float [] copiedprobabilities=new float[numberofletters];
    System.arraycopy(probabilities, 0, copiedprobabilities, 0, numberofletters);



    Sort(copiedprobabilities);   //WORKS PROPERLY


    for(int x=0;x<numberofletters;x++){
        grandoverseer[x][0]=copiedprobabilities[x];
    }

    for(int x=0;x<numberofletters;x++){
        System.out.println("Row "+grandoverseer[x][0]);
    }


    String [] lettercodes=new String[numberofletters];
    for(int x=0;x<numberofletters;x++){
        lettercodes[x]="";
    }



   for(int i=1;i<numberofletters;i++){
       grandoverseer[0][i]=grandoverseer[0][i-1]+grandoverseer[1][i-1];
      for(int j=1;j<numberofletters;j++){
          if(j==4) break;
        grandoverseer[j][i]=grandoverseer[j+1][i-1];
      }


      for(int k=0;k<numberofletters-i;k++){
          copiedprobabilities[k]=grandoverseer[k][i];
      }

      Sort(copiedprobabilities);

      for(int k=0;k<numberofletters-i;k++){
          grandoverseer[k][i]=copiedprobabilities[k];
      }


   }

   for(int x=0;x<numberofletters;x++){
       for(int y=0;y<numberofletters;y++){
           System.out.println("Row "+(x+1)+": "+grandoverseer[y][x]);
       }
   }

 }


 public static void Sort(float [] array){
    int smallestposition;
    for( int i=0; i<array.length;i++){
        smallestposition=i;
        for(int j=i+1; j<array.length ;j++){
        if(array[j]<array[smallestposition]){
            smallestposition=j;
        }
        }
        if(smallestposition!=i){
            float temp=array[i];
            array[i]=array[smallestposition];
            array[smallestposition]=temp;
        }
    }

  }
 }

我正在使用的示例是这样的:从A到E的5个字母,A:0.3,B:0.1,C:0.2,D:0.15,E:0.25

如果代码按预期工作,则将看到2D数组的以下输出:第1行:0.1、0.15、0.2、0.25、0.3第2行:0.2、0.25、0.25、0.3、0.0第3行:0.25、0.3、0.45 ,0.0,0.0第4行:0.45,0.55,0.0,0.0,0.0第5行:1.0,0.0,0.0,0.0,0.0

在此之后尝试打印数组将得到以下输出:第1行:0.1 0.15 0.2 0.25 0.3第2行:0.2 0.25 0.25 0.3 0.0第3行:0.25 0.3 0.3 0.0 0.0第4行: 0.3 0.3 0.0 0.0 0.0第5行: 0.3 0.0 0.0 0.0 0.0

突出显示的数字是不正确的,由于某种原因,在正确地对第二行进行了排序之后,第三行中的最后一个数字不是0.45而是0.3,并且0.3重复了其余的数字。出?

预先感谢您,如果造成任何混淆,我们深表歉意!

出于某些荒谬的原因,我尝试用新数组替换copyedprobabilities数组,而不是覆盖旧数组。

为什么这样行得通而覆盖复制的概率却没有,我永远不会知道...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM