2010-12-20 8 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はゼロで右をパディング、bitsが残しmaskのビットをシフトします。 bitsが32を除算しない場合は、32ビットは使用されません。したがって、bitsに32を割りますが、コードを破らない値を選択してください。