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;
    }