C++ 使用计数排序对字符串进行排序
我在这里查看了计数排序算法来对字符串进行排序:。我有几个问题:C++ 使用计数排序对字符串进行排序,c++,C++,我在这里查看了计数排序算法来对字符串进行排序:。我有几个问题: #定义范围255 范围的功能是什么?为什么我们必须明确定义从到255的范围 int计数[范围+1],i; 为什么我们必须将count[]的大小声明为RANGE+1?为什么不能是256 //存储每个字符的计数 对于(i=0;arr[i];++i) ++计数[arr[i]; 数组存储指定数字的计数,但这里我们有字符串中的字符,那么上面的代码如何将字符转换为要存储在数组中的等效数字 RANGE定义计数器的可能键。它们是0..RANG
#定义范围255
范围的功能是什么?为什么我们必须明确定义从到255的范围
int计数[范围+1],i;
为什么我们必须将count[]
的大小声明为RANGE+1
?为什么不能是256
//存储每个字符的计数
对于(i=0;arr[i];++i)
++计数[arr[i];
数组存储指定数字的计数,但这里我们有字符串中的字符,那么上面的代码如何将字符转换为要存储在数组中的等效数字
RANGE
定义计数器的可能键。它们是0..RANGE
。它可能是任意的,但255表示正好有256个可能的值。与不同字符的数量相同
所以我们有可能的键0..255。那正好是256。你可以这样硬编码。但由于范围
是任意的,因此您可能希望将其更改为512。在这种情况下,您也需要更改大小
从逻辑上讲,字符串是由字符组成的,但它只是我们大脑的表示。对于C++字符串,是一个数组:代码> char < /C> >类型。这是一个整数类型。由于表的国际部分仅使用值0..127
。我们可以安全地将这些值用作数组索引
我不会将该代码用作学习示例。它有太多的错误,我甚至不能正确地编译它
范围的功能是什么?
编译代码时,会事先运行一个称为预处理器的特殊程序。预处理器基本上替换了很多东西。它通常基于称为预处理器指令的语句执行此操作,这些语句以“#”符号开头。在这种情况下,#define RANGE 255
告诉预处理器将代码中出现的所有“RANGE”替换为“255”。例如,行int count[RANGE+1],i
变为int count[255+1],i
为什么我们必须明确地将范围定义为255?
老实说,我不知道为什么代码决定对范围使用255。我已经测试了代码,它在范围等于114的情况下运行良好,而在数字上不起作用。如果将输入字符串“geeksforgeks”的长度增加到更大的值,则范围将不够大
代码如何将字符转换为要存储在计数数组中的等效数字?
char
数据类型实际上是一个整数。我们使用的每个字符(A到Z、0到9、标点符号等)都有一个对应的数字。例如,下面的代码将打印出与a
相对应的数字,即“97”
#包括
int main()
{
字符名[]=“abc”;
int a=名称[0];
std::恐怕你的大多数问题都可以这样回答:不幸的是,该网站提倡不良做法。没有很好的理由定义一个常量。memset
有点好,但不好。使用arr[i]停止条件不是错误的,但也不是很好。不使用<代码> STD::数组 />代码:STD::向量有利于C数组。不要尝试从在线教程中学习C++,而是要抓取一个好的“值为128…127的整数类型”。这是错误的。char
可以是有符号的,也可以是无符号的。这里我们考虑的是有符号的char
,而不是没有符号的unsigned char
。这是错误的。char
可以是有符号的,也可以是无符号的,无论哪种方式,它都不同于signed char
和unsigned char
这里的ead:谢谢@idclev463035818指出这一点。删除了答案中错误的部分
#include <iostream>
int main()
{
char name[] = "abc";
int a = name[0];
std::cout << a;
return 0;
}