我一直在测试this实现radix-Sort:
public void RadixSort(int[] a)
{
// our helper array
int[] t=new int[a.Length];
// number of bits our group will be long
int r=4; // try to set this also to 2, 8 or 16 to see if it is quicker or not
// number of bits of a C# int
int b=32;
// counting and prefix arrays
// (note dimensions 2^r which is the number of all possible values of a r-bit number)
int[] count=new int[1<<r];
int[] pref=new int[1<<r];
// number of groups
int groups=(int)Math.Ceiling((double)b/(double)r);
// the mask to identify groups
int mask = (1<<r)-1;
// the algorithm:
for (int c=0, shift=0; c<groups; c++, shift+=r)
{
// reset count array
for (int j=0; j<count.Length; j++)
count[j]=0;
// counting elements of the c-th group
for (int i=0; i<a.Length; i++)
count[(a[i]>>shift)&mask]++;
// calculating prefixes
pref[0]=0;
for (int i=1; i<count.Length; i++)
pref[i]=pref[i-1]+count[i-1];
// from a[] to t[] elements ordered by c-th group
for (int i=0; i<a.Length; i++)
t[pref[(a[i]>>shift)&mask]++]=a[i];
// a[]=t[] and start again until the last group
t.CopyTo(a,0);
}
// a is sorted
}
而且我不太明白为什么你要将r设置为与b不同的值。 总是将它设置为b值,我得到了最好的结果。使用比b更小的值可以获得优势的例子是什么?
编辑:仅当您不使用输入类型的全部范围时才有效: 示例:如果使用r = b&lt;使用int []作为输入,则仅使用r = b进行排序。 32.因此,在b = 32的情况下,您需要将r设置为16
答案 0 :(得分:1)
我不明白使用2位将4000个元素分成3个组,因为4000/3不是2的幂。
如果值的范围是0到4000,并且数组的大小是> = 4000,则计数排序会更快:
#define SORTMAX 4000
void CountSort(int a[], size_t n)
{
size_t cnt[SORTMAX + 1];
for (size_t i = 0; i <= SORTMAX; i++)
cnt[i] = 0;
for (size_t i = 0; i < n; i++)
cnt[a[i]]++; // no out of range check
for (size_t j = 0, i = 0; i <= SORTMAX; i++)
while (cnt[i]--)
a[j++] = (int)i;
}