使用函数排序字符串数组

时间:2013-07-01 20:17:23

标签: c++ arrays string algorithm sorting

我想用这段代码对字符串数组进行排序:

void sort(string scadena[]){
    string temp;

    //here i am intenting sort the elements. it works fine

    for(int i=0;i<m;i++){
        for(int j=i+1;j<m;j++){
            if(scadena[i]>scadena[j]){
                temp=scadena[i];
                scadena[i]=scadena[j];
                scadena[j]=temp;    
            }           
        }
    }

    // Here i am intenting remove the repeated elements, but it not works fine.
    for(int i=0;i<m;i++){
        for(int j=0;j<m;j++){
            if(scadena[i]==scadena[j] && j!=i){
                for(int k=j;k <m; k++){
                    scadena[k]=scadena[k+1];
                }
                m--;
            }
        }
    }   

    //Because when i do the cout, the output has repeated elements. it not works
    for(int i=0;i<m;i++){
        cout<<i<<") "<<scadena[i]<<endl;
    }   
}

输出有重复的元素,但我不知道为什么。

完整的代码有一个函数来进行字符串的排列。

我不会发生什么。

5 个答案:

答案 0 :(得分:3)

编辑我刚刚看到这是作业。无论如何,一旦你完成了这个,这是一个惯用的C ++方式来排序字符串向量,并删除重复:

#include <algorithm> // for sort and unique
#include <vector>
#include <string>

....

std::vector<std::string> strings = ....;
std::sort(std::begin(strings), std::end(strings));
auto it = std::unique(std::begin(strings), std::end(strings));
strings.erase(it, std::end(strings);

答案 1 :(得分:3)

主要问题是当你从数组中删除一个元素时,你不应该递增j索引,因为当前索引处的字符串会发生变化,所以你需要再次检查它。

你可以通过在递减m的同时递减j来解决这个问题。

此外,看起来你在删除循环中超出了数组的末尾。

for(int k=j;k <m; k++){
    scadena[k]=scadena[k+1];
}

请注意,当k到达最后一次迭代(即k = m-1)时,您将从超过结束的位置m进行复制。

两个修复程序的更新循环应如下所示:

for(int i=0;i<m;i++){
    for(int j=0;j<m;j++){
        if(scadena[i]==scadena[j] && j!=i){
            for(int k=j;k+1 <m; k++){
                scadena[k]=scadena[k+1];
            }
            m--;
            j--;
        }
    }
}

答案 2 :(得分:1)

如果排序正常,那么您不需要遍历ij来比较字符串。您只需要遍历一个索引并与下一个字符串进行比较。然后,如果它们相等则删除下一个字符串,并且只有当它们不同时才增加索引。

以下是一些伪代码:

int i=0;
while(i+1<m)
  {
    if(scadena[i]==scadena[i+1])
      {
         // Delete scadena[i+1]
         .......
         m--;
      }
    else
      i++;
  }

答案 3 :(得分:0)

您可以修改循环体中的n循环上限,这可能是您遇到问题的原因,

所以删除行

 m--;

并跟踪另一个变量中剩余的字符串数 当你编写一个保持停止条件稳定的循环时,这是一个常见的好习惯。

答案 4 :(得分:0)

这应该有效!

for(int i=0;i<m;i++){
    for(int j=0;j<m;j++){
        if(scadena[i]==scadena[j] && j!=i){
            for(int k=j;k <(m-1); k++){
                scadena[k]=scadena[k+1];
            }
        }
    }
}