Sortieralgorithmus
Sam
- sonstiges
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:
Bsp.:
DAF-L-M-W --> M-L-DAF-W
Mein erster Ansatz war BubbleSort in drei Schritten (hintereinander ausgeführt),
aber das bringt nicht die gewünschte Reihenfolge.
Wie mache ich das richtig?
Grüße,
Sam
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
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?
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
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.
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
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.
Ähem, peinlich, wer lesen kann, ist bekanntlich klar im Vorteil ... ;-)
DANKE!
Die ist schon drin.
Sam
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
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 -> array3array1 und array2 und array3 sortieren und mergen. Fertig.