2013-07-01 149 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++; 
    }