2010-12-20 75 views
1
的價值

請參考下面的代碼基數排序:基數排序,R

class RadixSort 
{ 
    public static void radix_sort_uint(int[] a, int bits) 
    { 

     int[] b = new int[a.length]; 
     int[] b_orig = b; 


     int rshift = 0; 
     for (int mask = ~(-1 << bits); mask != 0; mask <<= bits, rshift += bits) { 

      int[] cntarray = new int[1 << bits]; 

      for (int p = 0; p < a.length; ++p) { 
       int key = (a[p] & mask) >> rshift; 
       ++cntarray[key]; 
      } 


     for (int i = 1; i < cntarray.length; ++i) 
         cntarray[i] += cntarray[i-1]; 


      for (int p = a.length-1; p >= 0; --p) { 
       int key = (a[p] & mask) >> rshift; 
       --cntarray[key]; 
       b[cntarray[key]] = a[p]; 
      } 


      int[] temp = b; b = a; a = temp; 
     } 


     if (a == b_orig) 
      System.arraycopy(a, 0, b, 0, a.length); 
    } 
} 

這是從維基百科下載。

我覺得該算法只適用於完美劃分32的參數值bits。因此,bits應該是2或4,但不是10.請讓我知道我是否正確。

回答

0

簡短的回答:沒有

龍答:

混淆的可能行是:

for (int mask = ~(-1 << bits); mask != 0; mask <<= bits, rshift += bits) { 

mask <<= bits轉移的mask位由bits留下,補零的權利。如果bits不分32,那麼完整的32位將不被使用。所以雖然bits應該除32,選擇一個不會破壞代碼的值。