Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 计数排序的修改_C++_Algorithm_Counting Sort - Fatal编程技术网

C++ 计数排序的修改

C++ 计数排序的修改,c++,algorithm,counting-sort,C++,Algorithm,Counting Sort,下面的计数排序根据元素的ASCII值对元素进行排序。 下面的代码工作正常,但我想做一些I/O修改。代码不接受自定义输入 我试图做一些改变,但得到未定义的行为。我的第一个疑问是为什么我会有不确定的行为。其次,请提供我的代码,这将使下面的代码按预期运行。评论部分是我自己尝试过的。我希望它能从用户那里获得输入。 #include<bits/stdc++.h> #include<string.h> using namespace std; #define RANGE 255

下面的计数排序根据元素的ASCII值对元素进行排序。 下面的代码工作正常,但我想做一些I/O修改。代码不接受自定义输入

我试图做一些改变,但得到未定义的行为。我的第一个疑问是为什么我会有不确定的行为。其次,请提供我的代码,这将使下面的代码按预期运行。评论部分是我自己尝试过的。我希望它能从用户那里获得输入。

#include<bits/stdc++.h>
#include<string.h>

using namespace std;

#define RANGE 255

void countSort(char arr[])      //void countSort(char arr[],int n)
{
    char output[strlen(arr)];   //char output[n];

    int count[RANGE + 1], i;
    memset(count, 0, sizeof(count));

    for(i = 0; arr[i]; i++) {
        count[arr[i]]++;
    }

    for (i = 1; i <= RANGE; ++i) {
        count[i] += count[i-1];
    }

    for (i = 0; arr[i]; ++i) {
        output[count[arr[i]]-1] = arr[i];
        --count[arr[i]];
    }

    for (i = 0; arr[i]; ++i) {
        arr[i] = output[i];
    }
}

// Driver code
int main()
{
    char arr[] = "geeksforgeeks";

    countSort(arr);

    cout<< "Sorted character array is "<<arr;

/*
    int n;
    cin>>n;
    char arr[n];

    for(int i=0;i<n;i++) {
        cin>>arr[i];
    }
    countSort(arr,n);

    for(int i=0;i<n;i++) {
        cout<<endl<<arr[i];
    }
*/
    return 0;
}
#包括
#包括
使用名称空间std;
#定义范围255
void countSort(char arr[])//void countSort(char arr[],int n)
{
字符输出[strlen(arr)];//字符输出[n];
整数计数[范围+1],i;
memset(count,0,sizeof(count));
对于(i=0;arr[i];i++){
计数[arr[i]]++;
}

对于(i=1;ii)来说,“获取未定义的行为”是指有时发生的分段错误。问题在于这一行

for(i = 0; arr[i]; i++)
相反,你应该写作

for(i = 0; i < n; i++)

所以OP问,如何从用户那里获取输入并对其排序,而不是给定字符数组中的预定义字符串

我会给出答案,但是这个问题用C++来标记,我会把它转换成C++。 顺便问一下,问题中的代码是一个一对一的拷贝,并试图对C++中所谓的计数排序算法进行编码。 <>因为代码是从GeeksforGeeks那里提取的,所以不幸的是,我需要把用户“RATBHUPENDERA”归咎于非常糟糕的C++代码。 代码使用的是:

  • C型阵列
  • 可变长度数组(编译器扩展,不兼容C++)
  • 斯特伦
  • 记忆集
  • #包括和#包括
  • 使用名称空间std
  • (i=0;arr[i];++i)
for循环中的异常结束条件
  • 字符数组而不是
    std::string
    s
  • 用于定义数组大小的宏(
    #定义范围255
  • 所以,没有C++ +< /P> 现在,答案来了

    您需要使用函数
    std::getline
    从用户的
    std::string
    类型变量中读取字符串

    字符串可以像字符数组一样使用。没有区别

    请参阅C++解决方案:

    编辑

    根据MichaelDorgan的评论编辑

    #include <iostream>
    #include <string>
    #include <vector>
    
    constexpr size_t AsciiRange = 256;
    
    // Convert signed char to unsigned size_t type.
    inline size_t char2sizet(char c) { return static_cast<size_t>(static_cast<unsigned char>(c)); }
    
    void countSort(std::string& stringToSort)      
    {
        std::vector<size_t> count(AsciiRange, 0U);
    
        size_t i { 0U };
        for (i = 0U; i < stringToSort.size(); i++) {
            count[char2sizet(stringToSort[i])]++;
        }
    
        for (i = 1U; i < AsciiRange; ++i) {
            count[i] += count[i - 1U];
        }
    
        std::string output(stringToSort);  
        for (i = 0U; i < stringToSort.size(); ++i) {
            output[count[char2sizet(stringToSort[i])] - 1U] = stringToSort[i];
            --count[char2sizet(stringToSort[i])];
        }
    
        stringToSort = output;
    }
    
    int main()
    {
        std::cout << "\nPlease enter a string:\n\n";
    
        // Get the string from the user
        std::string inputString{};
        getline(std::cin, inputString);
    
        // Sort it by characters
        countSort(inputString);
    
        // Show result
        std::cout << "\n\n\nString sorted by characters is:\n\n" << inputString << '\n';
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    constexpr size\u t ascirange=256;
    //将有符号字符转换为无符号大小类型。
    内联大小_t char2sizet(charc){return static_cast(static_cast(c));}
    void countSort(std::string和stringToSort)
    {
    标准:病媒计数(AsciiRange,0U);
    大小{0U};
    对于(i=0U;istd::cout@Ripi2
    strlen(arr)
    工作正常。但是当我传递字符数组及其长度时,会得到随机值。(@Ripi2是隐式的。)所以不是一个编码服务。请描述代码是如何完成的。在代码中:注释您的代码。您试图修改什么,观察到什么让您编写
    获取未定义的行为
    ?@greybeard因为我在主函数中通过循环提供一些输入,所以在打印数组时,希望它得到排序的是打印其他数组字符。请始终对代码进行格式化。它不仅帮助您阅读和理解代码,而且还帮助其他人,使其更容易被阅读。我用在线C++编译器运行代码,它分类得很好。问题是什么?不确定为什么会被否决。它似乎确切地表明了问题所在。@ Mich。ael Dorgan。你是对的,这是一个问题,因为有签名字符。我在这个trhead中提供了一个答案。但是我会相应地更新我的示例代码。关于上面的
    for(I=0;arr[I];I++)
    这将始终适用于C样式的以0结尾的字符串。但这并不好。如果我们坚持使用C,那么n将是
    strlen(arr)
    这更好,但没有拦路器。但是127以上的字符确实是个问题。顺便说一句,OP并没有问这个问题,而是问如何动态读取数据。@ArminMontigny没有,在编辑之前,他只问了
    代码,这将使下面的代码按预期运行。
    。关于
    用户输入的句子后来被添加。因此主要的问题是分割错误。@PawełBęza。我明白了。谢谢你的澄清。哇!!这帮了大忙。但我有一些疑问。
    constexpr size\u t ascirange=256;
    constexpr size\u t用于什么?std::vector count(ascirange,0U)
    count[static\u cast(stringToSort[I])]最重要的是,我可以从这里学习用C++标准编写代码。
    
    #include <iostream>
    #include <string>
    #include <vector>
    
    constexpr size_t AsciiRange = 256;
    
    // Convert signed char to unsigned size_t type.
    inline size_t char2sizet(char c) { return static_cast<size_t>(static_cast<unsigned char>(c)); }
    
    void countSort(std::string& stringToSort)      
    {
        std::vector<size_t> count(AsciiRange, 0U);
    
        size_t i { 0U };
        for (i = 0U; i < stringToSort.size(); i++) {
            count[char2sizet(stringToSort[i])]++;
        }
    
        for (i = 1U; i < AsciiRange; ++i) {
            count[i] += count[i - 1U];
        }
    
        std::string output(stringToSort);  
        for (i = 0U; i < stringToSort.size(); ++i) {
            output[count[char2sizet(stringToSort[i])] - 1U] = stringToSort[i];
            --count[char2sizet(stringToSort[i])];
        }
    
        stringToSort = output;
    }
    
    int main()
    {
        std::cout << "\nPlease enter a string:\n\n";
    
        // Get the string from the user
        std::string inputString{};
        getline(std::cin, inputString);
    
        // Sort it by characters
        countSort(inputString);
    
        // Show result
        std::cout << "\n\n\nString sorted by characters is:\n\n" << inputString << '\n';
    
        return 0;
    }