2017-04-12 220 views
0

我想通過java實現流行的哈夫曼代碼算法與二維數組。二維數組單排序

這個想法是創建這個二維數組,將輸入的概率排序並插入數組的第一行,然後每一行後面的第一個元素將是前一行中前兩個元素的總和。

然後在轉到下一行之前對當前行進行排序。

不幸的是有一個奇怪的輸出,我看到與二維數組中的單個行的排序。這是代碼。

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; 
     } 
    } 

    } 
} 

我正在使用的示例是這樣的:0.3,B:0.1,C:0.2,d:0.15,E:0.25

如果從A到E, 阿5個字母代碼按預期工作我會看到二維陣列的以下輸出: 第1行:0.1,0.15,0.2,0.25,0.3 第2行:0.2,0.25,0.25,0.3,0.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,一個d 0.3表示重複其餘的數字。 任何人都想幫助我解決這個問題?!

預先感謝您並對任何混淆抱歉!

回答

0

由於一些荒謬的原因,我試圖用一個新的數組替換複製的概率數組,而不是覆蓋舊的數組。

爲什麼工作和覆蓋複製概率沒有,我永遠不會知道...