簡體   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