Sam: Sortieralgorithmus

Servus!

Ich bastele gerade an einem Sortieralgorithmus (ASP mit VBScript) und stehe auf dem Schlauch.

Folgendes Problem ist zu lösen.
Ich habe ein Array mit 4 Werten. Es handelt sich um Strings (eine vorgebene Menge von Abkürzungen), die alphabetisch sortiert werden sollen. Dies ist natürlich kein Problem. Es gibt aber zwei Ausnahmen:

  • die Werte "M", "MU","BK" und "IN" stehen immer ganz vorne
  • "PH" und "L" stehen ebenfalls ganz vorne, allerdings hinter den zuvor genannten Werten.

Bsp.:

DAF-L-M-W  --> M-L-DAF-W

Mein erster Ansatz war BubbleSort in drei Schritten (hintereinander ausgeführt),

  1. if arrSort(i) > arrSort(j) then [tauschen....]
  2. if arrSort(j) = "PH" or arrSort(j) = "L" then [tauschen....]
  3. if arrSort(j)="M" or arrSort(j)="MU" or arrSort(j)="BK" or arrSort(j)="IN" then [tauschen....]

aber das bringt nicht die gewünschte Reihenfolge.

Wie mache ich das richtig?

Grüße,
Sam

  1. Hier mein 2. Versuch (alles in einer sub, nicht mehr drei separate hintereinander)

    Public Sub faechersort(ByRef arrSort)
      dim i, j, arrTemp
      for i = 0 to ubound(arrSort)
        for j = i + 1 to ubound(arrSort)
          if ((arrSort(j)<>"" and not isnull(arrSort(j))) and _
            (arrSort(i) > arrSort(j) and  _
            not (arrSort(i)="PH" or arrSort(i)="L" or arrSort(i)="M" or arrSort(i)="MU" or arrSort(i)="BK" or arrSort(i)="IN"))) _
            or (arrSort(j)="PH" or arrSort(j)="L" or arrSort(j)="M" or arrSort(j)="MU" or arrSort(j)="BK" or arrSort(j)="IN") then
              arrTemp = arrSort(i)
              arrSort(i) = arrSort(j)
              arrSort(j) = arrTemp
            end if
        next
      next
    End Sub

    Hier fehlt nun aber die Unterscheidung zwischen den Gruppen (PH,L) und (M,MU,BK,IN) - letztere Werte haben ja gegenüber den erstgenannten Priorität ....

    Grüße,
    Sam

    1. Hier fehlt nun aber die Unterscheidung zwischen den Gruppen (PH,L) und (M,MU,BK,IN) - letztere Werte haben ja gegenüber den erstgenannten Priorität ....

      Kurz zum Verständnis nochmal:
      Ich hab es so verstanden das du ALLE werte die mit zb: mit M anfangen haben willst, dann sollen die Werte nach PH und dann nach dem Namen geordnet werden.
      Also eine Ordnung die so aussehen sollte:

      M L  AAA
      M L  AAB

      M PH AAA
      M PH AAB

      MU L AAA
      MU L AAB

      ...
      usw.

      Richtig so ?
      Ich weis nicht ob ich es genau verstanden hab aber du willst ERST nach den (M,MU,BK,IN) geordnet haben und dann noch nach den andern werten (PH,L). und dann nach den Namen der dahinter noch kommen kann.

      Also wenn dann würde ich erst Nur nach (M,MU,BK,IN) in dem String suchen und ordnen lassen.
      Also diese im Zweifelsfall in einem neuen Array zwischenspeichern.

      Dann haste schon
      M      ungeordnet
      M      ungeordnet

      MU     ungeordnet
      MU     ungeordnet

      BK     ungeordnet
      BK     ungeordnet

      IN     ungeordnet
      IN     ungeordnet

      Das neue Array ordnen nach den (PH,L) in dem du vorher (M,MU,BK,IN) aus dem String entfernst.

      M      L ungeordnet
      M      L ungeordnet
      M      PH ungeordnet

      ...
      usw

      Das selbe dann mit Namen wenn dann danach noch einer kommt. Wieder die ersten Werte ausklammern und dann ordnen lassen

      M      L  AAA
      M      L  AAB
      M      PH ungeordnet

      Oder bin ich da gerade Falsch eingestiegen?

      1. Hi!

        Ich weis nicht ob ich es genau verstanden hab aber du willst ERST nach den (M,MU,BK,IN) geordnet haben und dann noch nach den andern werten (PH,L). und dann nach den Namen der dahinter noch kommen kann.

        Nicht ganz ... diese Buchstaben sind jeweils schon der gesamte String, da kommt nichts mehr dahinter. Zum besseren Verständnis, es handelt sich um Schulfächer (Mathe, Musik, Bildende Kunst, Informatik) und (Physik, Latein).
        Eine Person kann nun bis zu 4 Fächer angeben.
        Die Eingabe soll dann so sortiert werden, dass Fächer aus der erstgenannten Gruppe immer zuerst genannt werden, dahinter die andere Gruppe und dahinter alle weiteren, und zwar alphabetisch geordnet.

        (Hätte ich auch gleich so erklären können, sorry!!! Aber manchmal erkennt man die Verständnis-Probleme anderer nicht, manm selbst weiß ja wie's gemeint ist ....)

        Maxx' Idee wird wohl funktionieren, ich setz mich jetzt mal dran ...

        Aber auch Dir vielen Dank für Deine Mühe!

        CU, Sam

        1. Nicht ganz ... diese Buchstaben sind jeweils schon der gesamte String, da kommt nichts mehr dahinter. Zum besseren Verständnis, es handelt sich um Schulfächer (Mathe, Musik, Bildende Kunst, Informatik) und (Physik, Latein).

          in dem Fall, würde ich eine Funktion einbauen, die den Wert wichtet, in etwa so:

          (ich kann kein ASP, daher in JS Syntax)

          function wichtung(wert)  
          {  
          var w;  
          if( wert == 'M' || wert == "MU" || wert == "BK"  || wert == "IN") w = '0';  
          else if( wert == 'PH' || wert == "L" ) w = '1';  
          else w = '2';  
          return w + wert  
          }  
          
          

          und dann deine Vergleiche entsprechend:
          if wichtung( arrSort(j) ) > wichtung( arrSort(j) ) then  ...

          Struppi.

          --
          Javascript ist toll (Perl auch!)
          1. Hi Struppi,
            das klingt auch gut.
            Aber wie bekomme ich dann noch die alphabetische Reihnefolge innerhalb einer "Wichtungs-Gruppe" rein?

            in dem Fall, würde ich eine Funktion einbauen, die den Wert wichtet, in etwa so:

            (ich kann kein ASP, daher in JS Syntax)

            function wichtung(wert)

            {
            var w;
            if( wert == 'M' || wert == "MU" || wert == "BK"  || wert == "IN") w = '0';
            else if( wert == 'PH' || wert == "L" ) w = '1';
            else w = '2';
            return w + wert
            }

            
            >   
            > und dann deine Vergleiche entsprechend:  
            > if wichtung( arrSort(j) ) > wichtung( arrSort(j) ) then  ...  
              
            LG, Sam
            
            1. Hi Struppi,
              das klingt auch gut.
              Aber wie bekomme ich dann noch die alphabetische Reihnefolge innerhalb einer "Wichtungs-Gruppe" rein?

              Die ist schon drin.

              Struppi.

              --
              Javascript ist toll (Perl auch!)
              1. Ähem, peinlich, wer lesen kann, ist bekanntlich klar im Vorteil ... ;-)
                DANKE!

                Die ist schon drin.

                Sam

  2. Hallo Sam,

    • die Werte "M", "MU","BK" und "IN" stehen immer ganz vorne
    • "PH" und "L" stehen ebenfalls ganz vorne, allerdings hinter den zuvor genannten Werten.

    ich würde mit getrennten Arrays arbeiten.
      Das Original durchlaufen
          "M", "MU","BK" und "IN" -> array1
          "PH" und "L"            -> array2
          der Rest                -> array3

    array1 und array2 und array3 sortieren und mergen. Fertig.

    Grüße,

    Jochen

    --
    Kritzeln statt texten:
    Scribbleboard
    1. Hi Jochen! Gute Idee, danke dir!

      ich würde mit getrennten Arrays arbeiten.
        Das Original durchlaufen
            "M", "MU","BK" und "IN" -> array1
            "PH" und "L"            -> array2
            der Rest                -> array3

      array1 und array2 und array3 sortieren und mergen. Fertig.