试图了解我的数据结构类的基数排序。我的老师向我们展示了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,该参数可以均等地转换为floatdoublelong double(所有log10重载的类型),因此选择的重载不是向编译器清除。只需在整个(double)参数之前粘贴一个log10强制转换即可。

顺便说一句,可以通过仅查找最大int(以绝对值表示)然后以10为底的对数来发现所需的位数来简化/优化该代码。

10-05 18:11