对字符串中的字符进行排序

时间:2017-06-23 12:48:16

标签: c++ string algorithm

给定一个字符串s,两个数字nm,我必须按降序对两个indeces(包括两者)之间的字符串字符进行排序。

我写了这个程序,但是我没有得到正确的排序字符串。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t ;
    cin >>t ;
    while(t--) {
        int n ,m ,i ,j;
        string s ;
        char c ;
        cin >> s >> n >> m ;
        for(i=n;i<m;i++) {
            for(j=n+1;j<=m;j++) {
                if( s[j]>s[i] ) {
                    swap(s[i],s[j]) ;
                }
            }
        }
        cout << s  << '\n' ;
    }
    return 0;
}

你能告诉我我的代码有什么问题吗?

3 个答案:

答案 0 :(得分:1)

您正在检查是否s[j] > s[i] - 如果有,则进行交换,即使i < j
要解决此问题,您可能希望从i+1而不是n+1开始第二个循环。

for(i=n;i<m;i++){
  for(j=i+1;j<=m;j++){
  //    ^ i instead of n
    if( s[j]>s[i] ) {
      swap(s[i],s[j]) ;
    }
  }
}

作为旁注,这是非常低效的排序算法。

P.S。确保j<=m是有意的,你不需要强烈的不平等。

答案 1 :(得分:1)

在这种情况下,我更喜欢使用标准库实用程序,例如

auto mid = s.substr(n, m-n);
std::sort(mid.begin(), mid.end(), std::greater<char>());
std::cout << s.substr(0, n) << mid << s.substr(m, s.size()-m);

所以例如

s = "dictionary"
n = 2
m = 8

会产生

ditonicary 

答案 2 :(得分:1)

我是第二个@CoryCramer给出的答案,但是我已经到位了:

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

int main( void )
{
    std::string s = "This is the string to sort";

    size_t m = 3;
    size_t n = 10;
    std::sort( s.begin() + m, s.begin() + n );
    std::cout << s << '\n';
}

输出:将他的字符串排序

如果没有理由,尽量不要使用原始循环,恕我直言,我的代码比OP建议的代码更具可读性。