2013-07-01 3 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

Основная проблема заключается в том, что при удалении элемента из массива, вы не должны» t увеличивать индекс j, потому что строка в текущем индексе будет изменена, поэтому вам нужно снова проверить ее.

Вы можете исправить это, уменьшив j одновременно с уменьшением m.

Кроме того, похоже, что вы перекрываете конец массива в цикле удаления.

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

Обратите внимание, что, когда к достигает последней итерации (т.е. к = т-1), вы собираетесь копировать с позиции м, которая в конце прошлого.

Обновленный цикл с обеих исправлений должен выглядеть следующим образом:

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

Если сортировка работает правильно, то вам не нужно перебираем как i и j для сравнения строк. Вам нужно всего лишь перебрать один индекс и сравнить его со следующей строкой. Затем вы удаляете следующую строку, если они равны, и только увеличивайте индекс, если они разные.

Вот некоторые псевдо-код:

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