C++ 基数排序算法
Posted
技术标签:
【中文标题】C++ 基数排序算法【英文标题】:C++ Radix sort algorithm 【发布时间】:2012-02-09 23:42:43 【问题描述】:试图了解我的数据结构类的基数排序。我的老师向我们展示了 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 循环的作用以及为什么我得到那个模棱两可的调用错误?谢谢
【问题讨论】:
放置其余代码?这部分只从所有数字中找到最大位数 【参考方案1】:那段代码只是搜索“最长”整数所需的位数;这可能需要稍后分配一些缓冲区。
log10
为您提供与其参数相对应的 10 次方,该参数四舍五入到下一个整数(因此 +1
后跟 (int)
强制转换,导致截断),为您提供号码所需的数字。
log10
的参数有点乱,因为 abs
被调用了两次,而只需要一次就足够了。尽管如此,这个想法仍然是将被检查的数字的绝对值传递给log10
,如果它不为零,或者如果它为零,则为 1 - 这是因为,如果参数为零,对数将发散到负无穷大(即在这种情况下是不可取的,我认为转换为 int
会导致奇怪的结果)。
循环的其余部分只是搜索最大值:在每次迭代中,它都会计算当前正在检查的 int 所需的数字,检查它是否大于“当前最大值”(d
),如果它大于是,它取代了“当前最大值”。
d+=1
可能用于警示目的 (?) 或用于分配字符串的空终止符,这取决于之后如何使用 d
。
至于“模棱两可的调用”错误:你得到它是因为你用int
参数调用log10
,它可以同样转换为float
、double
和long double
(所有类型为其中log10
被重载),因此编译器不清楚要选择的重载。只需在整个 log10
参数之前加上 (double)
演员表。
顺便说一句,该代码可以通过查找最大值 int
(绝对值)并然后采用以 10 为底的对数来发现位数来简化/优化需要。
【讨论】:
我如何找到你说的最大 int 来优化代码?谢谢 做同样的事情,但使用数字而不是对数,即迭代数组并在每次迭代时检查当前元素的绝对值是否大于“当前最大值”,如果它将它(绝对值)存储为新的最大值。在循环结束时,取其以 10 为底的对数,并按照您的代码对其进行四舍五入,您将获得所需的最大位数。【参考方案2】:以 10 + 1 为底的对数为您提供数字中存在的总位数。
本质上,您正在检查数组A[]
中的每个元素,如果元素为== 0,则将1 存储在digits_temp 变量中。
您将 d = 1 初始化为一个数字应该至少有 1 位,如果它超过 1,则将其替换为计算的位数。
希望对您有所帮助。
【讨论】:
【参考方案3】:log10函数有3种定义,分别是float,double,long double input。
log10( static_cast<double> (abs(A[i]!=0 ? abs(A[i]) : 1)) );
因此您需要将其静态转换为 double 以避免错误。
(int)log10(x)+1 给出该数字中存在的位数。
Rest 是 Radix Sort 的简单实现
【讨论】:
【参考方案4】:您会看到警告,因为 log10 是为 float、double 和 long double 定义的,但不是整数,并且它是用整数调用的。编译器可以将 int 转换为任何这些类型,因此调用是不明确的。
for 循环对数组中任何数字的最大位数进行线性搜索。它不必要地复杂和缓慢,因为您可以简单地搜索 A 中的最大绝对值,然后取其 log10。
void RadixSort(int A[], int size)
int max_abs = 1;
for(int i = 0; i < size; ++i)
if(abs(A[i] > max_abs)
max_abs = abs(A[i]);
int d += log10(float(max_abs));
/* rest of the implementation */
【讨论】:
【参考方案5】:缺少其余代码,因此无法准确确定用法。
但基本上基数排序会遍历所有整数并对它们进行排序,比较数字数字从最低有效向上开始。
代码的第一部分仅确定数组中整数的最大位数 count+1,这可用于将所有数字标准化为相同长度以便于处理。
即 (1,239,2134) 到 (0001,0239,2134)
【讨论】:
以上是关于C++ 基数排序算法的主要内容,如果未能解决你的问题,请参考以下文章