试图了解我的数据结构类的基数排序。我的老师向我们展示了C++中的基数排序示例。我不明白数字的for循环的作用,她说了一些关于最大数字的问题。另外,当我在VS中尝试此操作时,它说log10是对重载函数的模棱两可的调用。
void RadixSort(int A[], int size)
{
int d = 1;
for(int i = 0; i < size; ++i)
{
int digits_temp;
digits_temp=(int)log10(abs(A[i]!=0 ? abs(A[i]) : 1)) +1;
if(digits_temp > d)
d = digits_temp;
}
d += 1;
*rest of the implementation*
}
谁能解释这个for循环的作用以及为什么我会得到那个模棱两可的调用错误?谢谢
最佳答案
那段代码只是搜索“最长”整数所需的位数。以后可能需要分配一些缓冲区。log10
为您提供与其参数相对应的10的幂,然后将其舍入为下一个整数(因此+1
后跟(int)
强制转换,这会导致截断)为您提供该数字所需的位数。log10
的参数有点困惑,因为abs
在一次就足够的情况下被调用了两次。不过,我们的想法是将要检查的数字的绝对值(如果它不为零,或者为1,如果它为零)的绝对值传递给log10
,因为这是因为,如果参数为零,对数将趋于负无穷大(这是不希望的)在这种情况下,我认为转换为int
会导致奇怪的结果)。
循环的其余部分只是寻找最大值:在每次迭代中,它都会计算要检查的当前int所需的位数,检查它是否大于“当前最大值”(d
),如果大于,则替换“当前最大值”。d+=1
可能出于警告目的(?)或分配的字符串的空终止符,这取决于之后如何使用d
。
至于“歧义调用”错误:之所以会得到它,是因为您正在使用log10
参数调用int
,该参数可以均等地转换为float
,double
和long double
(所有log10
重载的类型),因此选择的重载不是向编译器清除。只需在整个(double)
参数之前粘贴一个log10
强制转换即可。
顺便说一句,可以通过仅查找最大int
(以绝对值表示)然后以10为底的对数来发现所需的位数来简化/优化该代码。