您好我正在尝试理解Radix排序的逻辑,我指的是维基百科的代码。 这是接收数组的排序的sort函数,以及元素的数量。 虽然代码运行得很好,但我无法理解代码的逻辑。 在while循环中,我们首先初始化一个10位数的桶数组,其中包含1的no和2的数量,用于数组的第一个和第二个索引。但在那之后,很难理解它想要做什么。
static void sort(int a[],int n)
{
int i=0;
int m =a[0];
int b[]=new int[n];
int exp=1;
for (i = 0; i < n; i++)
{
if (a[i] > m)
m = a[i];
}
while (m / exp > 0)
{
int bucket[] =new int[10];
for (i = 0; i < n; i++)
bucket[a[i] / exp % 10]++;
for (i = 1; i < 10; i++)
bucket[i] += bucket[i - 1];
for (i = n - 1; i >= 0; i--)
b[--bucket[a[i] / exp % 10]] = a[i];
for (i = 0; i < n; i++)
a[i] = b[i];
exp *= 10;
System.out.println("\nPASS : ");
for(int c:a){
System.out.print(c+",");
}
System.out.println();
}
}
任何人都可以帮我吗?感谢
答案 0 :(得分:2)
即使您知道基数排序如何工作,此代码也需要付出一些努力才能理解。首先理解基数排序的抽象描述比尝试从这段代码中反向设计它更容易。
关于代码的一些技术观察:
exp
,它从1,10,100 ...到10的连续幂,并确定我们当前排序的数字的十进制数字。a[]
和每个桶中从n到1)。b[]
数组中表示为间隔(其偏移量在第二个内循环中根据第一个内循环的桶数计算)bucket[d]
是将存储其活动数字(我们排序的数字)为d
的数字的区间的上端(不包括)的索引。铲斗间隔从此端向下填充。