Seite 1 von 2

string sortieren

Verfasst: 16.11.2004 15:00
von BitchBird
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ö

Verfasst: 16.11.2004 15:25
von MLK
du kannst zeichen für zeichen in ein array einlesen und dieses dann mit SortArray() nach wunsch sortieren.

Verfasst: 16.11.2004 15:27
von DarkDragon
@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)

Verfasst: 16.11.2004 15:34
von Kaeru Gaman
@DarkDragon

...ist das der berühmte QuickSort-Algo ? ...ich weiss den nichmehr genau...

Verfasst: 16.11.2004 16:05
von DarkDragon
Ja isser. Der ist nämlich der einfachste.

Verfasst: 16.11.2004 16:09
von remi_meier
@DarkDragon: ist kein Quatsch:

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))
Kann jetzt auch n Denkfehler drinhaben, hoffe aber nicht :roll:

Verfasst: 16.11.2004 16:14
von Kaeru Gaman
@remi

...nun, wahrscheinlich ist im Sort_Array der quicksort in ASS implementiert..

...könnte ja DarkDragon auch noch machen, dann wird der bestimmt in 'ne LIB dazugestellt... :wink:

Verfasst: 16.11.2004 16:22
von remi_meier
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 :wink:

Verfasst: 16.11.2004 16:27
von Kaeru Gaman
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 :wink:

Verfasst: 16.11.2004 16:34
von remi_meier
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 :wink:
wenn du mit "geschwindigkeit/kürze" das Verhältnis zwischen Geschwindigkeit und Codekürze meinst, könntest du vielleicht sogar recht haben :roll:
greetz
remi