C++基排序算法
C++ Radix sort algorithm
试图理解数据结构类的基数排序。我的老师给我们看了一个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
被调用了两次,而只调用一次就足够了。尽管如此,我们的想法是,如果被检查的数字不是零,就把它的绝对值传给log10
,如果它是零,就传给1——这是因为,如果自变量是零,对数会发散到负无穷大(在这种情况下,这是不可取的,我认为转换为int
会导致奇怪的结果)。
循环的其余部分只是搜索最大值:在每次迭代中,它计算被检查的当前int所需的数字,检查它是否大于"当前最大值"(d
),如果大于,则替换"当前最大"。
d+=1
可能是出于警示目的(?),也可能是为了分配字符串的空终止符,这取决于之后如何使用d
。
至于"模糊调用"错误:您之所以得到它,是因为您使用int
参数调用log10
,该参数可以等效地转换为float
、double
和long double
(log10
重载的所有类型),因此编译器不清楚要选择的重载。只需在整个log10
参数之前粘贴一个(double)
强制转换即可。
顺便说一句,该代码本可以通过查找最大int
(绝对值)和来简化/优化,然后取以10为底的对数来发现所需的位数。
对数基数10+1为您提供一个数字中的数字总数。本质上,在这里,您要检查数组A[]
中的每个元素,如果该元素==0,则将1存储在digitals_temp变量中。您将d=1初始化为一个数字,该数字应至少有1个数字,如果它的数字超过1,则将其替换为计算出的数字。
希望能有所帮助。
log10函数有三种类型的定义,分别是float、double和long double输入。
log10( static_cast<double> (abs(A[i]!=0 ? abs(A[i]) : 1)) );
因此,您需要将其静态转换为double以避免出现错误。
(int)log10(x)+1给出该数字中的位数。
Rest是Radix Sort 的简单实现
您看到了警告,因为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 */
}
缺少其余代码,因此无法准确确定用法。
但基本上,基数排序会遍历所有整数,并将它们从最不重要的数字开始向上进行比较。
代码的第一部分只确定数组中整数的最大数字计数+1,这可以用于将所有数字归一化为相同的长度,以便于处理。
即(12392134)到(000102392134)
- C++选择排序算法中的逻辑错误
- 排序算法c++
- 下面是排序算法O(n)吗
- 为什么我的排序算法会更改数组值
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 排序算法问题(购买商店物品)(崩溃)
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 为什么在此排序算法实现中,向量明显比数组慢?
- C++ 多线程 - 与线程合并排序的算法替代
- C++中合并排序算法的奇怪行为
- 如果要求比较器是严格的总排序,而不仅仅是严格的弱排序,C++标准算法会更快吗?
- 我的排序算法程序中的堆错误
- 运行合并排序递归算法时EXC_BAD_ACCESS错误
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- 解释一下这个排序算法是如何工作的?
- 检查向量是否使用除法和阻抗算法进行排序
- 使用sort()算法C 排序对象列表
- 算法排序1101001011
- 克鲁斯卡尔算法(排序)
- 用STL算法排序结构的动态数组