为什么不可能像对c ++数组那样对字符串进行排序?

时间:2019-09-09 07:02:22

标签: c++

我们不能像对数组进行经典排序(气泡排序之类的)那样对字符串进行排序吗?但这不起作用。

string newstr = "dcba";
for(int i = 0; i < (newstr.size())-1; i++)
    {
        for(int k = i+1; k < newstr.size(); k++)
        {
            if(newstr[i] > newstr[k])
            {
                temp = newstr[i];
                newstr[k] = newstr[i];
                newstr[i] = temp;
            }
        }
    }

3 个答案:

答案 0 :(得分:3)

编写的代码越少,所犯的错误越少,这是遵循的好规则。要对字符串进行排序,您可以执行以下操作:

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
  std::string newstr = "dcba";
  std::sort(newstr.begin(), newstr.end());
  std::cout << newstr << "\n";
}

您的代码中的实际错误是由于swap的实现不正确造成的:

temp = newstr[i];
newstr[k] = newstr[i];
newstr[i] = temp;

应该是:

temp = newstr[k];
newstr[k] = newstr[i];
newstr[i] = temp;

或更简单地说:

std::swap(newstr[i], newstr[k]);

答案 1 :(得分:2)

您没有正确交换字符。

使用

temp = newstr[k];

代替

temp = newstr[i];

使用您的代码,您到处都在复制newstr [i],因为

temp = newstr[i];         // tmp = i
newstr[k] = newstr[i];    // k   = i
newstr[i] = temp;         // i   = tmp = i

答案 2 :(得分:2)

掌握基础知识。您将循环运行到newstr.size()-1;,这意味着您不考虑最后一个元素或到达它。您的交换逻辑也是错误的。

修改后的代码-

for(int i = 0; i < newstr.size(); i++)
    {
        for(int k = i+1; k < newstr.size(); k++)
        {
            if(newstr[i] > newstr[k])
            {
                std::swap(newstr[i] , newstr[k]);
            }
        }
    }

您还可以执行std::sort(newstr.begin(),newstr.end());