2010-12-20 89 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,选择一个不会破坏代码的值。