string sortieren
string sortieren
heyho!
ich hab da eine frage: gibt es eine function mit der man einen string sortieren kann? z.b. "fkjghdfsk234962" halt ziffern nach aufsteigender groesse und dann buchstaben nach alphabet?
falls nicht, kann einer mal so eine procedure basteln?
dankö
ich hab da eine frage: gibt es eine function mit der man einen string sortieren kann? z.b. "fkjghdfsk234962" halt ziffern nach aufsteigender groesse und dann buchstaben nach alphabet?
falls nicht, kann einer mal so eine procedure basteln?
dankö
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
@MLK: das ist doch quatsch, da programmiert man sich das schnell selbst:
Code: Alles auswählen
Procedure ChangeLetters(*String, Index1, Index2)
l1.b = PeekB(*String+Index1)
PokeB(*String+Index1, PeekB(*String+Index2))
PokeB(*String+Index2, l1)
EndProcedure
Procedure.s SortString(String.s, Flag) ;Flags: 0=abc 1=cba
If Flag = 0
For k=1 To Len(String.s)
cur = Asc(Mid(String, k, 1))
For i=k To Len(String)
If Asc(Mid(String, i, 1)) < cur
ChangeLetters(@String, k-1, i-1)
String = SortString(String.s, Flag)
Break 2
EndIf
Next
Next
Else
For k=1 To Len(String.s)
cur = Asc(Mid(String, k, 1))
For i=k To Len(String)
If Asc(Mid(String, i, 1)) > cur
ChangeLetters(@String, k-1, i-1)
String = SortString(String.s, Flag)
Break 2
EndIf
Next
Next
EndIf
ProcedureReturn String
EndProcedure
Text.s = "a3cc2ba1"
Debug Text
Debug SortString(Text, 0)
Debug SortString(Text, 1)Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
@DarkDragon: ist kein Quatsch:
Kann jetzt auch n Denkfehler drinhaben, hoffe aber nicht 
Code: Alles auswählen
Procedure ChangeLetters(*String, Index1, Index2)
l1.b = PeekB(*String+Index1)
PokeB(*String+Index1, PeekB(*String+Index2))
PokeB(*String+Index2, l1)
EndProcedure
Procedure.s SortString(String.s) ;Flags: 0=abc 1=cba
For k=1 To Len(String.s)
cur = Asc(Mid(String, k, 1))
For i=k To Len(String)
If Asc(Mid(String, i, 1)) > cur
ChangeLetters(@String, k-1, i-1)
String = SortString(String.s)
Break 2
EndIf
Next
Next
ProcedureReturn String
EndProcedure
Procedure.s SortString2(String.s)
Protected Length
Length = Len(String)
Dim string.b(Length)
CopyMemory(@String, @string(), Length)
SortArray(string(),3)
CopyMemory(@string(), @String, Length)
Dim string.b(0)
ProcedureReturn String
EndProcedure
Text.s = "a3cc2ba1"
Debug Text
Debug SortString(Text)
Debug "-----------"
Debug SortString2(Text)
time1 = ElapsedMilliseconds()
For z = 0 To 1000000
SortString(Text)
Next
time1 = ElapsedMilliseconds() - time1
time2 = ElapsedMilliseconds()
For z = 0 To 1000000
SortString2(Text)
Next
time2 = ElapsedMilliseconds() - time2
MessageRequester("", Str(time1) + " " + Str(time2))-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Seine Prozedur ist wahrscheinlich vor allem langsamer, weil:
- Nicht Asm (weiss zwar nicht ob PB-Lib hier in ASM geschr wurde)
- Rekursiv
- Funktionsaufruf ChangeLetters
- Mid() anstatt Pointer
Weiss eben eigentlich nicht, ob PBs Algo nicht auch rekursiv und nicht in Asm geschrieben wurde, vermute ich aber wegen dem grossen Zeitunterschied
PS: Ich weiss er kanns besser
- Nicht Asm (weiss zwar nicht ob PB-Lib hier in ASM geschr wurde)
- Rekursiv
- Funktionsaufruf ChangeLetters
- Mid() anstatt Pointer
Weiss eben eigentlich nicht, ob PBs Algo nicht auch rekursiv und nicht in Asm geschrieben wurde, vermute ich aber wegen dem grossen Zeitunterschied
PS: Ich weiss er kanns besser
-
Kaeru Gaman
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
quicksort IST definitiv das nonplusultra in punkto geschwindigkeit/kürze..
...kann mir ehrlich gesagt kaum vorstellen, dass SortArray nen anderen algo benutzt... nur in ASM und mit pointers ist der latürnich x-mal schneller
...kann mir ehrlich gesagt kaum vorstellen, dass SortArray nen anderen algo benutzt... nur in ASM und mit pointers ist der latürnich x-mal schneller
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Würde hier nicht auf definitiv beharren! Kommt immer auf die Daten an, die du dem Algorithmus übergibst. Er ist aber sicher ein sehr schneller Kompromiss zwischen den einzelnen Sortieralgos
Bubble Sort, Insertion Sort, Quicksort, Selection Sort, Shellsort,...
jeder hat seine Vorteile! Ich glabe, dass Quicksort vor allem bei schon relativ sortierten einträgen nicht gerade schnell ist, kann mich aber auch irren.
Ausserdem sind rekursive Algos meist langsamer als ihre nichtrekursiven Verwandten
wenn du mit "geschwindigkeit/kürze" das Verhältnis zwischen Geschwindigkeit und Codekürze meinst, könntest du vielleicht sogar recht haben
greetz
remi
Bubble Sort, Insertion Sort, Quicksort, Selection Sort, Shellsort,...
jeder hat seine Vorteile! Ich glabe, dass Quicksort vor allem bei schon relativ sortierten einträgen nicht gerade schnell ist, kann mich aber auch irren.
Ausserdem sind rekursive Algos meist langsamer als ihre nichtrekursiven Verwandten
wenn du mit "geschwindigkeit/kürze" das Verhältnis zwischen Geschwindigkeit und Codekürze meinst, könntest du vielleicht sogar recht haben
greetz
remi