title image


Smiley SwirlSort - hier wirbelt's kräftig!
SwirlSort basiert auf einem ganz frühen Versuch meinerseits, einen eigenen Sortieralgorithmus zu entwickeln. Tatsächlich ist dieser Algorithmus "anders als alle anderen" und ich könnte von daher stolz auf seine Erfindung sein, wenn seine Laufzeit nicht so furchtbar schlecht wäre (die mit Abstand schlechteste von allen!).Ich hätte ihn auch niemals der Öffentlichkeit vorgestellt, wenn er im Visualisierungsprogramm nicht so lustig aussehen würde. Die Werte werden ständig durcheinandergewirbelt (daher der Name) und trotzdem kommt irgendwann die richtige Sortierreihenfolge raus.Wie geht er vor? Es wird ein temporäres Array aMore angelegt, welches für jedes Element aus aDaten eine Kennung speichert. Ursprünglich hatte ich die Kennungen 1 und -1 vergeben, aber dann entschied ich mich für TRUE und FALSE. Das erste Element bekommt die Kennung TRUE, das nächste eine Kennung abhängig von seiner Größe: Ist es kleiner als das erste, FALSE, ist es größer oder gleich, TRUE. Bei den folgenden Elementen wird analog verfahren: Sie bekommen jeweils eine Kennung in Abhängigkeit von ihrer Größe und zwar immer im Vergleich zu ihrem Vorgängerelement. Ist das Ende erreicht, werden die Daten in ein weiteres temporäres Array (aDatenTemp) geschrieben: Zuerst alle mit FALSE, daran anschließend alle mit TRUE. Als nächstes werden die so "sortierten" Werte" zurück in aDaten geschrieben und dann beginnt das Spiel von vorn: Der erste Wert bekommt die Kennung TRUE, die folgenden FALSE oder TRUE, immer abhängig von ihrem Vorgänger.Diese Vorgehensweise wird nun solange wiederholt, bis es keine Werte mehr gibt, die kleiner als ihr Vorgänger sind. Mit anderen Worten: Haben im Vergleichsarray aMore alle Werte die Kennung TRUE, gilt das Array aDaten als sortiert und das Programm kann beendet werden.Der Effekt ist, dass die Werte immer wieder neu "durchgeschüttelt" werden, so dass manche von ihnen etliche Male ihren Platz tauschen müssen. So nach und nach baut sich aber (von hinten beginnend) eine sortierte Reihenfolge auf.Das ganze ist nicht sehr effizient, aber es funktioniert tatsächlich ;-)      Sub SwirlSort(aDaten())    Dim aDatenTemp(), aMore() As Boolean    Dim n As Long, x As Long, y As Long    n = UBound(aDaten)    ReDim aMore(1 To n)    ReDim aDatenTemp(1 To n)    Do        aMore(1) = True        For x = 2 To n            If aDaten(x) >= aDaten(x - 1) Then                aMore(x) = True            Else                aMore(x) = False            End If        Next        y = 0        For x = 1 To n            If aMore(x) = False Then                y = y + 1                aDatenTemp(y) = aDaten(x)            End If        Next        If y = 0 Then Exit Do        For x = 1 To n            If aMore(x) = True Then                y = y + 1                aDatenTemp(y) = aDaten(x)            End If        Next        For x = 1 To n            aDaten(x) = aDatenTemp(x)        Next    LoopEnd Sub Code eingefügt mit Syntaxhighlighter 3.0


mfg

Ralf

Der Computer löst Probleme, 
die es ohne ihn nicht gäbe!



geschrieben von

Anhang
Bild 45331 zu Artikel 1913272

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: