Bubblesort - string



  • Hallo,

    ich hab bereits Bubblesort für normale integer-Werte programmiert und sollte es nach bestimmten Vorgaben jetzt auch für eine Liste von Strings bzw. namen in meinem Beispiel machen. Leider sortiert mein Programm nichts.
    Ich hoffe man kann den Code so lesen.

    Bin offen fuer alle Denkanstöße, solang ihr freundlich bleibt und ja ich möchte es auch verstehen 😉

    Hier der Code:
    ________________________________________________________________________________

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int vergleich( char *a, char *b)
    {
      if (strcmp( a, b) > 0) 
        return 1;
      else
        return 0;    
    }
    
    int tausch(char **a, char **b) {			
     char *tmp;				
    
     tmp = *a;					
     *a = *b;
     *b = tmp;
    
     return 1;
    }
    
    enum { EINTRAEGE = 20 } ;
    typedef char name[EINTRAEGE] ;				/* Datentyp name als Feld mit 20 Char-Eintraegen musste definiert werden - Was ist aber mit namen.txt?*/
    
    void bubbleSort ( int n , name a[EINTRAEGE] ) 
    {
     int i, m, j, vertauscht ;
     char *x[99999];					/* ich verwende hier einen Pointer fuer weitere Bearbeitung */
    
      for ( i = 0 ; i <= EINTRAEGE ; i++ ) {
        x[i] = calloc(strlen(*a)+1, sizeof(char));		/* Speicherreservierung - nutze hierfuer calloc aus stdlib */
        strcpy(x[i], *a);
      }
    
     m = n ;
     do
     {
      for(i = 0; i < m - 1; ++i) {				
          for(j = i + 1; j < n; ++j){			
    	if(vergleich(x[i], x[j])) {			
    	vertauscht = tausch(&x[i], &x[j]);
          }
         }
        }
        m-= 1 ;
     }   while (m > 1 && vertauscht ) ; 
    
      printf("Sortierte Ausgabe: \n");
      for(i = 0; i <= n; ++i)				
          printf( " %s\n", a[i] ) ;
      printf( "\n") ;
    }
    
    int main( void ) 
    {
      name input[EINTRAEGE] ; 
      int i ; 
    
      for ( i = 0 ; i <= EINTRAEGE ; i++ ) {				
        printf( "Bitte das gewuenschte Zeichen eingeben ( %d-te Eingabe) : \n", i ) ;		/* Eingabeaufforderung */
        scanf("%s", input[i] ) ; 			
      }
    
      bubbleSort( i, input);
    
      return 0 ;
    }
    


  • Dank fehlender Einrückung möchte ich deinen Code eher ungern lesen, aber was spricht gegen eine abstrakte bsort Funktion, mit qsort aus der <stdlib.h> als Vorbild?

    (Implementierung des Algorithmus einfach mal frei nach wikipedia.org)

    void bsort(void *arr, size_t n, size_t s, int (*comp)(const void*, const void*))
    {
      int tmp;
      char *buf = (char*)malloc(s);
      if (!buf)
        return;
      do {
        tmp = 0;
        for (int i = s; i < n * s; i += s)
          if (comp((char*)arr + i - s, (char*)arr + i) > 0)
          {
            memcpy(buf, (char*)arr + i - s, s);
            memcpy((char*)arr + i - s, (char*)arr + i, s);
            memcpy((char*)arr + i, buf, s);
            tmp = 1;
          }
      } while(tmp);
      free(buf);
    }
    

    Damit kannst du dann alles sortieren was dir vor den Bildschirm rennt 😉



  • Ganz verstehen tuh ich die Kritik am Code nicht. Bei mir ernscheint er normal eingerückt ?

    Mein Programm war eigentlich an deinen Vorschlag bereits abgelehnt, nur muss ich für die Aufgabe jeweils eine Funktionen für das Vergleichen und eine für das Tauschen implementieren.



  • jojoom schrieb:

    Ganz verstehen tuh ich die Kritik am Code nicht. Bei mir ernscheint er normal eingerückt ?

    Schau's dir doch da oben an - das sieht aus wie Kraut und Rüben. Wenn du einrückst, solltest du nicht Leerzeichen und Tabulatoren nebeneinander verwenden.

    Mein Programm war eigentlich an deinen Vorschlag bereits abgelehnt, nur muss ich für die Aufgabe jeweils eine Funktionen für das Vergleichen und eine für das Tauschen implementieren.

    Das Tauschen ist bei cookie's Vorschlag direkt in der Funktion enthalten (die drei memcpy()-Zeilen), für's Vergleichen ist es besser, sich nicht auf einen Typ festzulegen (in C++ hätte ich Templates verwendet, hier bleibt nur die Arbeit mit void-Pointern).



  • jojoom schrieb:

    Vergleichen

    Du sollst quasi strcmp() nachbauen? Ist doch witzlos..

    int str_cmp(const void *a, const void *b)
    {
      const char *p1 = (char*)a, *p2 = (char*)b;
      while (*p1 && *p2)
        if (*p1++ != *p2++)
          return *(p1 - 1) - *(p2 - 1);
      return *p1 - *p2;
    }
    

Anmelden zum Antworten