c++ - 计数排序的修改
问题描述
下面的计数排序根据元素的 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;
}
解决方案
所以 OP 询问,如何从用户那里获取输入并对其进行排序。而不是给定 char 数组中的预定义字符串。
我会给出答案。但问题是用 C++ 标记的,我会将其转换为 C++。
顺便一提。问题中的代码是GeeksforGeeks的一对一副本,并尝试在此处描述的 C++ 中编写所谓的计数排序算法。
由于代码取自 GeeksforGeeks,不幸的是,我需要将非常糟糕的 C++ 代码归咎于用户“rathbhupendra”。我真的很抱歉。
该代码正在使用:
- C 样式数组
- 可变长度数组(编译器扩展。不符合 C++)
- 斯特伦
- 内存集
#include<bits/stdc++.h> and #include<string.h>
- 使用命名空间标准
- for 循环中的异常结束条件
for(i = 0; arr[i]; ++i)
- char 数组而不是
std::string
s - 定义数组大小的宏 (
#define RANGE 255
)
所以,没有 C++。
现在,答案。
您需要std::string
使用函数在类型变量中从用户那里读取字符串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;
}
希望这可以帮助 。. .
推荐阅读
- flutter - 为什么我在 Flutter 测试期间使用 rootBundle.load 得到“对空值使用空检查运算符”?
- c - 在 C 中使用指针存储给定数量的数字
- python - 如何从 PDF 上的特定位置/范围提取文本 (PyPDF2)
- javascript - 如何允许我的 Product1 用户从 Product1 网页为我的 Product2 链接添加书签?
- excel - VBA根据单元格值将整行复制到不同的工作表,到下一个可用行
- python - 通过在随机子集(数据帧)中选择的背包问题
- excel - 如何将图表从一个工作表复制到我的工作簿中的其余工作表,而新创建的图表从它复制到的工作表中获取数据?
- python - 计算熊猫系列中下划线后的值
- r - 将不同的游戏平滑回归 (mgcv) 与 ggally [R] 配对
- jquery - 我需要帮助在 shopify 中定位 datepicker