按字母顺序排列的字符串
Posted
技术标签:
【中文标题】按字母顺序排列的字符串【英文标题】:string in alphabetical order 【发布时间】:2014-08-22 16:19:41 【问题描述】:我正在尝试使用递归函数按字母顺序打印字符串,但它给出的字符串下标超出范围错误。
string alpha(string word)
char temp;
int count = 0;
int i = 0;
while (count < word.size())
if (word[i] > word[i + 1])
temp = word[i];
word[i] = word[i + 1];
word[i + 1] = temp;
i++;
if (i >= word.size())
alpha(word);
else
count++;
return word;
【问题讨论】:
为什么不使用std::sort
?
问题是word[i + 1]
。当您的 i
达到最大索引时,这会将您推到它之外。
因为我想做一个函数
while (count < word.size() - 1) i++; if (word[i] > word[i + 1]) temp = word[i]; word[i] = word[i + 1]; word[i + 1] = temp; else if (i >= word.size()) alpha(word); else count++; return word;
@JonThemon
即使您确实创建了自己的函数,也绝对没有理由使用内联交换而不是使用std::swap
。顺便说一句,这不是按字母顺序排列的。 “ABab”不应保持这种状态。
【参考方案1】:
因为您使用if (word[i] > word[i + 1])
,所以您必须在循环结束前停止循环...并且您需要count
或i
(不能同时使用两者);那是
while (i + 1 < word.size()) // <-- like so
或者你可以使用
int i = 1;
while (i < word.size())
if (word[i - 1] > word[i])
【讨论】:
【参考方案2】:我会这样做:
std::string alpha(std::string s)
std::sort(s.begin(), s.end());
return s;
Demo
如果你想自己实现一个O(n²)
排序算法,你可以这样做:
std::string alpha(std::string word)
for (std::size_t i = 0; i != word.size(); ++i)
for (std::size_t j = i + 1; j != word.size(); ++j)
if (word[j] < word[i])
std::swap(word[i], word[j]);
return word;
或递归的:
std::string alpha(std::string word)
auto it = std::is_sorted_until(word.begin(), word.end());
if (it == word.end())
return word;
std::size_t i = std::distance(word.begin(), it);
do
std::swap(word[i], word[i - 1]);
--i;
while (i > 1 && word[i] < word[i - 1]);
return alpha(word);
【讨论】:
以上是关于按字母顺序排列的字符串的主要内容,如果未能解决你的问题,请参考以下文章