Sortieren von Zeichenketten (Array)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Sortieren von Zeichenketten (Array)

    Hallo ihr lieben,

    ich versuche schon seit Stunden mein kleines Script fertig zu bekommen, aber scheitere am richtigen Einsatz der for-schleife

    die Zeichenketten sind in a[i] gespeichert (i steht für die anzahl der zk, kleine zählvariable). die zeichenketten sollen lexikografisch sortiert werden.

    der pseudocode sieht bisher folgerndermaßen aus:

    PHP-Code:
    for(j=0<= i-1j++) {
     
    strcmp(a[erstes element], a[nächstes element]);

    aber wie spreche ich in der schleife immer das erste element und das folgende des arrays an, vergleiche die beiden und tausche gegebenfalls?
    also bei
    j=0 --> a[0] und a[1];
    j=1 --> a[1] und a[2];

    hier mal nen kleines beispiel, was rauskommen sollte:

    Eingabe: --> wird zu:
    Code:
    aab                    aaa
    aaa                    aab
    adc                    adc
    czw                    czw
    würde mich über ne kleine hilfestellung sehr freuen

    edit: mir fällt grad ein, das folgende variante laufen sollte:

    for(j=0; j <= i-1; j++) {
    strcmp(a[0+j], a[1+j]);
    }
    Zuletzt geändert von Jessy_87; 01.05.2010, 18:29.

  • #2
    PHP: sort - Manual

    Kommentar


    • #3
      das problem ist dabei, dass ich nicht in php schreibe, sondern in C, sich aber die grundlegende Syntax nicht unterscheidet...

      Kommentar


      • #4
        Zitat von Jessy_87 Beitrag anzeigen
        das problem ist dabei, dass ich nicht in php schreibe, sondern in C
        Dann bist du hier im Forum wohl ein wenig falsch.

        Kommentar


        • #5
          naja im c-forum ist recht wenig los und wie schon gesagt, die syntax ist letztlich die gleiche

          also wie würde es ohne die sort()-fkt gehen?

          Kommentar


          • #6
            Zitat von Jessy_87 Beitrag anzeigen
            naja im c-forum ist recht wenig los und wie schon gesagt, die syntax ist letztlich die gleiche

            also wie würde es ohne die sort()-fkt gehen?
            Du kannst dir ja den Source-Code von sort() anschauen. PHP ist auch nur in C programmiert.

            Kommentar


            • #7
              ehm....

              rein theoretisch müsste der folgende code mit einer hilfsvariablen doch richtig sein, oder?

              Code:
              for (j=0; j<=i-1; j++) {
                          if (strcmp(a[0+j], a[1+j]) == 1) {       // zweites element ist größer als erstes
                             char tmp = a[0+j];
                             a[0+j] = a[1+j];
                             a[1+j] = tmp;
                          }
                      }

              Kommentar


              • #8
                Also wenn es hier um C geht, ist das definitiv das falsche Forum. Daher * verschieb *

                Peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #9
                  C selbst hat keine eingebaute Sortierfunktion. Aber die Standard-Library hat eine. Der übergibst du einen Zeiger auf deine Vergleichsfunktion. Insofern ist die Vorgehensweise tatsächlich so ähnlich (aber nicht gleich) wie in PHP.

                  Mit einer For-Schleife bekommst du jedenfalls in beiden nichts sortiert. Mit zwei verschachtelten schon. Dieses Verfahren nennt sich Bubblesort.
                  Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                  Kommentar


                  • #10
                    habe es mittlerweile raus...
                    und ja ich hab zwei verschaltelte for-schleifen

                    Kommentar


                    • #11
                      Zitat von Jessy_87 Beitrag anzeigen
                      habe es mittlerweile raus...
                      und ja ich hab zwei verschaltelte for-schleifen
                      Quellcode oder nie passiert.

                      Mit nur einer for-Schleife kann man ein C-Array nicht sortieren. Und strcmp() eignet sich nicht zur lexikographischen Sortierung -- es vergleicht "ASCII-betisch".
                      Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                      Kommentar


                      • #12
                        ok, das versteh ich nicht so recht
                        bei mir funktioniert es einwandfrei...

                        PHP-Code:
                        void sortieren(){
                           for (
                        k=0i-1k++) {                        
                                for (
                        j=0j<i-1j++) { 
                                    if (
                        strcmp(a[j], a[j+1]) == 1) {       
                                       
                        char *tmp a[j];
                                       
                        a[j] = a[j+1];
                                       
                        a[j+1] = tmp;
                                    }
                                }
                           }

                        davon abgesehen, dass bubble-sort echt nen blöder algorithmus ist (laufzeit)...
                        Zuletzt geändert von Jessy_87; 01.05.2010, 21:39.

                        Kommentar


                        • #13
                          Zitat von Jessy_87 Beitrag anzeigen
                          ...
                          bei mir funktioniert es einwandfrei...
                          Erlaubst du mir, dies zu bezweifeln?

                          PHP-Code:
                          void sortieren(){
                             for (
                          k=0i-1k++) {                        
                                  for (
                          j=0j<i-1j++) { 
                                      if (
                          strcmp(a[j], a[j+1]) == 1) {       
                                         
                          char *tmp a[j];
                                         
                          a[j] = a[j+1];
                                         
                          a[j+1] = tmp;
                                      }
                                  }
                             }

                          Meine C-Kenntnisse sind nicht sehr gut, aber irgendwas sagt mir, dass das Aus-dem-Hut-Zaubern bspw. der Variablen a einen ordentlich konfigurierten Compiler dazu veranlassen dürfte, mindestens eine Warnung auszuspucken. Das Gleiche gilt für "k < i - 1" ohne vorherige Deklaration und Initialisierung von i. Und strcmp() liefert bei Ungleichheit durchaus auch andere Werte als nur 1.

                          Da ich keine Lust auf Warnungen und Fehlermeldungen eines C-Compilers hatte, hab ich das mal in PHP nachgebaut:

                          PHP-Code:
                          function sortieren($a) {
                              for (
                          $k 0$k $i 1$k++) {
                                  for (
                          $j 0$j $i 1$j++) {
                                      if (
                          strcmp($a[$j], $a[j+1]) === 1) {
                                          
                          $tmp $a[$j];
                                          
                          $a[$j] = $a[$j 1];
                                          
                          $a[1] = $tmp;
                                      }
                                  }

                              }
                              return 
                          $a;
                          }

                          // dein Ausgangsarray
                          $a preg_split('/\s+/''
                          aab                    aaa
                          aaa                    aab
                          adc                    adc
                          czw                    czw
                          '
                          , -1PREG_SPLIT_NO_EMPTY);

                          // die Funktion aufrufen
                          $x sortieren($a);

                          //
                          var_dump($x); 
                          Bei Ausführung dieses Scripts wird ein nicht initialisiertes $i bemäkelt.

                          Außerdem ist das Ergebnis-Array in der gleichen Reihenfolge sortiert, wie das Ausgangs-Array ...

                          Einwandfreies Funktionieren stelle ich mir etwas anders vor ...

                          davon abgesehen, dass bubble-sort echt nen blöder algorithmus ist (laufzeit)...
                          Seine Laufzeit dürfte der deines Ansatzes gleich kommen -- zwei verschachtelte For-Schleifen über ein Array von Zeichenketten ...
                          Warum benutzt du nicht, wie von mir vorgeschlagen, die in der Standard-Lib eingebaute Sortierfunktion?
                          Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                          Kommentar


                          • #14
                            alle benötigten variablen wurden vor der main()-fkt deklariert und initialisiert...
                            dein quellcode in php ist doch genau der gleiche wie auch meiner
                            nur die qsort-fkt sollte ich mir mal anschauen...

                            Kommentar


                            • #15
                              Zitat von Jessy_87 Beitrag anzeigen
                              alle benötigten variablen wurden vor der main()-fkt deklariert und initialisiert...
                              Globale Variablen ...?
                              *wegrenn*
                              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                              Kommentar

                              Lädt...
                              X