2010-05-31 75 views
0

我有以下代碼:關於產品LSD基數排序

public class LSD{ 
    public static int R=1<<8; 
    public static int bytesword=4; 
    public static void radixLSD(int a[],int l,int r){ 
     int aux[]=new int[a.length]; 

     for (int d=bytesword-1;d>=0;d--){ 
      int i, j; 
      int count[]=new int[R+1]; 
      for (j=0;j<R;j++) count[j]=0; 
      for (i=l;i<=r;i++) 
       count[digit(a[i],d)+1]++; 
      for (j=1;j<R;j++) 
       count[j]+=count[j-1]; 
      for (i=l;i<=r;i++) 
       aux[count[digit(a[i],d)]++]=a[i]; 
      for (i=l;i<=r;i++) 
       a[i]=aux[i-1]; // <-- Line 19 
     } 
    } 

    public static void main(String[]args){ 
     int a[]=new int[]{3,6,5,7,4,8,9}; 
     radixLSD(a,0,a.length-1); 

     for (int i=0;i<a.length;i++){ 
      System.out.println(a[i]); 
     } 
    } 

    public static int digit(int n,int d){ 
     return (n>>d)&1; 
    } 
} 

在運行時,它拋出以下異常:

java.lang.ArrayIndexOutOfBoundsException: -1 
at LSD.radixLSD(LSD.java:19) 
at LSD.main(LSD.java:29) 

這是爲什麼發生?

+0

這將有助於如果你標記哪一行是第19行。你知道,幫助我們幫助你。 – polygenelubricants 2010-05-31 06:38:21

+0

我不使用IDE,所以我不能確定哪裏是第19行我在witing程序 – 2010-05-31 06:46:39

+1

如果你不能計數到19你可能沒有準備好編寫排序例程。 – 2010-05-31 06:52:36

回答

1

我對基數排序知之甚少,不知道你的代碼應該是什麼,但爲什麼它目前失敗很明顯。你打電話radixLSDl傳遞0:

radixLSD(a,0,a.length-1); 

當你得到這個代碼:

for (i=l;i<=r;i++) 
    a[i]=aux[i-1]; 

在第一遍,i設置爲l(0),並嘗試做aux[i-1]aux[-1],這是超出範圍

+0

謝謝,但我認爲在代碼中有些事情是錯誤的我從C++中的算法編寫代碼robert sedgewick任何人都可以給我鏈接這個代碼以更優雅的方式寫在哪裏? – 2010-05-31 07:12:15