2016-04-26 5 views
-11

Ich versuche, eine Funktion zu machen, die 'argv' bekommt und die Strings darin mit bubble sort sortiert. Aus irgendeinem Grund funktioniert die Blasensortierung nicht und ich kann das Problem nicht finden.Blasensortierung mit Strings

void order(int howmany, char** strings) 
{ 
    int i = 0; 
    char* temp = (char*)malloc(sizeof(char)*20); 

    for (i = 1; i < howmany-1; i++) 
    { 
     if (strcmp(strings[i], strings[i + 1]) > 0) 
     { 
      strcpy(temp, strings[i]); 
      strcpy(strings[i], strings[i+1]); 
      strcpy(strings[i + 1], temp); 
     } 
     else if (strcmp(strings[i], strings[i + 1]) < 0) 
     { 
      continue; 
     } 
     else 
     { 
      continue; 
     } 

    } 

} 
+2

Sie sollten ein Debugging durchführen. –

+1

Problem ist die Logik mit Bubble-Sort, http://stackoverflow.com/questions/16636890/sorting-strings-with-bubble-sort-algorithm –

+2

Es ist eine schlechte Idee, die Befehlszeilenparameter in-Place zu ändern. Machen Sie eine Kopie von ihnen zuerst, dann sortieren Sie sie. – Lundin

Antwort

3

Zum Sortieren aller Zeichenfolgen benötigen Sie mehr als eine Schleife. Mit einer Schleife bewegen Sie einfach die erste kleinste/größte an die entsprechende Stelle und dann stoppt der Algorithmus. Warum starten Sie auch von i = 1 statt 0? So vergleichen Sie die erste Saite nicht mit anderen. Glück

1

Diese eine leicht optimierte Blasensortierung verwendet (unnötige Vergleiche in Teilfolge überspringen Pässe) aus dem Wikipedia-Artikel, C. übersetzte Da wir durch die Ergebnisse des strcmp eine Reihe von Nicht-NULL char * (geordneter Sortierung auf die referenzierten Strings), tauscht es Pointer statt String-Inhalt aus.

#include <stdio.h> 
#include <string.h> 

void order(int howmany, char** strings) 
{ 
    int i; 
    char* temp; 
    int lastswap; 

    do 
    { 
     lastswap = 0; 
     for (i = 0; i < howmany - 1; i++) 
     { 
      if (strcmp(strings[i], strings[i + 1]) > 0) 
      { 
       temp = strings[i]; 
       strings[i] = strings[i + 1]; 
       strings[i + 1] = temp; 
       lastswap = i; 
      } 
     } 
     howmany = lastswap; 
    } 
    while (lastswap != 0); 
} 

int main(int argc, char** argv) 
{ 
    int i; 
    int howmany; 
    char** strings; 

    if (argc > 0) { 
     howmany = argc - 1; 
     strings = argv + 1; 
     order(howmany, strings); 
     for (i = 0; i < howmany; i++) 
      printf("%s\n", strings[i]); 
    } 
    return 0; 
}