Sortieren von Types von ??? |
[code:1:5040fd5df9] SeedRnd(MilliSecs()) Type tabelle Field name$ End Type Local create.tabelle For i=0 To 10 create = New tabelle create ame$ = Chr$(Rand(65,90)) + Chr$(Rand(65,90)) + Chr$(Rand(65,90)) Next DebugLog "----------UNSORTIERT" SUB_out() SUB_sort() ; HIER WIRD SORTIERT DebugLog "----------SORTIERT" SUB_out() WaitKey() Function SUB_sort() Local sort.tabelle Local help.tabelle Local litle.tabelle Local search.tabelle ; Voreinstellungen ; erster Wert ist der kleinste litle = First tabelle ; wird an das ende von der tabelle verschoben Insert litle After Last tabelle ; sort wird an anfangsposition gesetzt sort = First tabelle ; Hauptschleife für SORT Repeat ; sort in help kopieren, da sonst sort beim ; verschieben von help ins leere zeigt help = sort ; sort schon mal vorsorglich auf die nächste ; position verschieben sort = After sort ; zeigt sort ins leere oder ist an das ende gekommen? If sort = Null Then Return ; Kontroll-Ausgabe ;SUB_out() ;--- ; vergleichen der beiden inhalte If help ame$ <= litle ame$ Then ; Konroll-Ausgabe ;DebugLog "help <= litle "+ help ame$ +" <= "+ litle ame$ ; wen ja, so kommt help vor litle Insert help Before litle ; und wird als neuster kleinster wert deffiniert litle = help Else ; Konroll-Ausgabe ;DebugLog "help > litle "+ help ame$ +" > "+ litle ame$ ; die suche beginnt, litle ist der startpunkt search = litle Repeat ; search wird eine position vor geschoben search = After search ; ist search schon an das ende gekommen? If search = Null Then ; wen ja, so kommt help an das ende der tabelle ; da help ja der zur zeit den grösste wert enthält Insert help After Last tabelle ; die suche kann beendet werden Exit EndIf ; ist der help kleiner als search? If help ame$ <= search ame$ Then ; wen ja, so wird help vor search eingefügt Insert help Before search ; due suche kann beendet werden Exit EndIf Forever EndIf ; wen sort und litle gleich sind, so wurden alle ; werte miteinander verglichen und die sortierung ; kann beendet werden If sort = litle Then Return Forever End Function ;----------------- Function SUB_out() Local test.tabelle For test = Each tabelle DebugLog test ame$ Next DebugLog "" End Function [/code:1:5040fd5df9] |
von ??? |
Das soll eine Function sein, die ein paar Types in der Reihenfolge nach sortiert, richtig? Das kann ich dir nachher mal etwas vereinfacht und kürzer geben... Bin nur vorerst weg, vllt heute Abend ;) |
von ??? |
Dies ist eine Möglichkeit von vielen Sortier-Algorithemen... Aber auf deine Lösung bin ich schon gespannt... bis heute Abend... |
von ??? |
Sorry, das es eine Woche gedauert hat, aber ich habe den Thret total vergessen... Naja, hier meine Funktion: [code:1:545d6caa0d]function sortieren() for t.typ=each typ if t ame$<wert$ then insert t before first typ wert$=t ame$ next end function[/code:1:545d6caa0d] Ich hoffe mal nicht, dass du jetzt traurig bist, dass dein langer Skript im Grunde sinnlos geworden ist :wink:. Wer noch Fehler findet, soll sich bitte melden. Ich wollte damals eine Sortierroutine schreiben und habe festgestellt, dass die Funktion mit den 4 Zeilen schon einwandfrei funktioniert. Bisher habe ich noch keine Fehler gefunden, und eigendlich schon recht häufig eingesetzt. Bedient euch :D |
von ??? |
ehm explosive, ich glaube eher dein source wird wohl kaum gehen |
von ??? |
@explosive, ich glaube nicht das dein Code funzt, bzw habe ich es auch getestet... irgendwie komme ich in einer Endlosschleife... [code:1:15ed510261] Type typ Field name$ End Type For i=0 To 100 x.typ = New typ x ame$ = Chr$(Rand(65,90)) + Chr$(Rand(65,90)) + Chr$(Rand(65,90)) DebugLog x ame$ Next DebugLog "" DebugLog " sort" sortieren() For j.typ = Each typ DebugLog "> "+ j ame$ Next WaitKey() Function sortieren() For t.typ=Each typ If t ame$ < wert$ Then Insert t Before First typ wert$=t ame$ DebugLog "_ "+ t ame$ Next End Function [/code:1:15ed510261] |
von ??? |
hm? was machst du denn da? du erstellst eine variable x.typ, sortierst eine variable t.typ und gibst eine variable j.typ aus. :shock: kann doch irgendwie nicht gehen, oder? |
von ??? |
aha, und ich dachte es gäbe keine zeiger bei blitz :) wieder was gelernt! |
von ??? |
Eigentlich sollte explosives Code funktionieren (auch wenn man es kaum glauben mag) mit O(n^2). Nicht der schnellste Sortieralgorithmus aber auch kein schlechter. Endlosschleife? :shock: |
von ??? |
[quote:e7596b74ad="Valio"]Endlosschleife? :shock:[/quote:e7596b74ad] Habe ja den Code/Sortiertalgoritmus getestet, der bleibt einfach hängen bei einem Wert von 1000... Hier nochmals eine genauere Analyse. Debuger eingschaltet und nach ein paar Sekunden den roten Knopf drücken. Der springt immer wieder an den Anfang, und so wird das ganze bis zu X mal gescheckt. Bei 10 zahlen, ca. 300-600 mal Bei 12 zahlen, ca. bis 3500 mal Also eine fast logaritmische Zunahme... [code:1:e7596b74ad] SeedRnd(MilliSecs()) Type typ Field name$ End Type For i=0 To 9 x.typ = New typ x ame$ = Chr$(Rand(65,90)) + Chr$(Rand(65,90)) + Chr$(Rand(65,90)) DebugLog x ame$ Next DebugLog "" DebugLog " sort" Global count sortieren() For j.typ = Each typ DebugLog "> "+ j ame$ Next WaitKey() Function sortieren() For t.typ=Each typ count = count + 1 If t ame$ < wert$ Then DebugLog "" For test.typ = Each typ If test = t Then test_zeiger$ = "<" : Else test_zeiger$ = "" DebugLog test ame$ + test_zeiger$ Next Insert t Before First typ DebugLog "count > "+ count EndIf wert$=t ame$ Next End Function [/code:1:e7596b74ad] |
von ??? |
valio, eine sehr gute seite zum thema: http://www.iti.fh-flensburg.de/lang/algorithmen/sortieren/quick/quick.htm und nicht wirklich schwer...nicht wenn unmittelbar vor seinem vordiplom steht ;). |
@ hicks: von ??? |
Danke für den Link. Quicksort ist an sich auch nicht wirklich schwer, allerdings muss man bei linearen Pointerlisten (wie z.B. Types) einige zusätzliche Aspekte beachten, da diese ja keinen Index besitzen. |