2013-07-01 201 views
1

我intenting排序字符串数组与此代码:排序字符串数组与函数

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; 
    } 
} 

输出已经重复的元素,但我不为什么。

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

我不会发生什么事情。

+8

任何理由不使用['标准:: sort'(http://en.cppreference.com/w/cpp/algorithm/sort)? – juanchopanza

+0

'std :: swap()'有什么问题? – genpfault

+1

@ juanchopanza它的功课,所以他不能使用它。看到这里:http://stackoverflow.com/questions/17396222/how-to-generate-all-permutations-of-an-array-in-sorted-order – Borgleader

回答

3

的主要问题是,当你从数组中删除一个元素,你不该”因为当前索引处的字符串已经改变,所以你需要再次检查它。

您可以通过在减少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--; 
     } 
    } 
} 
+0

感谢您的帮助=) –

0

您修改了ň循环上限在循环体中它可能是你的问题的原因,

所以删除行

m--; 

和跟踪另一个变量 串的剩余数量当您编写一个保持停止条件稳定的循环时,这是一种常见的良好做法。

+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); 
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]; 
      } 
     } 
    } 
} 
+0

我意图与它,但不工作 –

1

如果排序工作正常,那么你不需要循环在两个ij比较字符串。您只需循环一个索引并与下一个字符串进行比较。然后,如果它们相等,则删除下一个字符串,并且只在索引不同时增加索引。

下面是一些伪代码:

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