Gambas: Sortieren

Aus Wikibooks


zurück zu Gambas


Sortierverfahren werden bei Datenbanken, Tabellen, Arrays und vielem mehr gebraucht. Einige einfache Sortierverfahren werden im Folgenden beschrieben.

Ripplesort[Bearbeiten]

Sie haben eine Zahlenfolge 13,12,15,11,14 . Diese Zahlen wollen Sie in aufsteigender Reihenfolge ordnen, so daß die kleinste Zahl am Anfang und die größte am Ende steht.

Wie das geht zeigt folgendes Programm. Es nutzt ein Array ( siehe Gambas: Arrays) und mehrere Hilfsvariablen . Dieses Array wird mehrfach durchsortiert, bis die Reihenfolge stimmt.

Sie brauchen eine Form und einen Commandbutton, um das Programm in Gang zu bringen.

' Gambas class file
ar AS Integer[]
PUBLIC SUB Form_Open()
'schon beim Öffnen der Form wird der Array mit lauter Nullen gefüllt.
x AS Integer
ar = NEW Integer[]
ME.Text = "Sortieren"
FOR x = 0 TO 4
 ar.Add(Str(0))
NEXT
END
PUBLIC SUB Button1_Click()
c AS Integer 
j AS Integer 
n AS Integer 
y AS Integer 
element AS Integer 
y = 0
n = ar.count 
ar[0] = 13
ar[1] = 12
ar[2] = 15
ar[3] = 11
ar[4] = 14
REPEAT 
c = 0
 FOR j = 0 TO n - 2
   PRINT j,y,ar[0],ar[1],ar[2],ar[3],ar[4]
    IF ar[j] > ar[j + 1] THEN 
     y = ar[j] 
     ar[j] = ar[j + 1]
     ar[j + 1] = y 
     c = 1
    ENDIF 
 NEXT 
UNTIL c = 0 
END

Die Ausgabe im Direktfenster schaut dann so aus:

 PRINT j,y,ar[0],ar[1],ar[2],ar[3],ar[4]
0      0       1       2       3       4       5
0       0       13      12      15      11      14
1	13	12	13	15	11	14
2	13	12	13	15	11	14
3	15	12	13	11	15	14
0	15	12	13	11	14	15
1	15	12	13	11	14	15
2	13	12	11	13	14	15
3	13	12	11	13	14	15
0	13	12	11	13	14	15
1	12	11	12	13	14	15
2	12	11	12	13	14	15
3	12	11	12	13	14	15
0	12	11	12	13	14	15
1	12	11	12	13	14	15
2	12	11	12	13	14	15
3	12	11	12	13	14	15

Das Sortierverfahren steckt in der Repeat until Schleife . Darin steckt eine for next Schleife und darin steckt wieder eine Vertauschung mit if then . Das ist schon ein bißchen schwer zu kapieren. Mit der ausführlichen Ausgabe im Direktfenster kann man das Sortieren genau verfolgen. Man kann den Array ändern und andere Zahlen einfügen. Dann kann man wieder zuschauen, wie die Sortierung abläuft. Der Kern ist eine Vertauschung zweier benachbarter Zahlen, wenn die linke Zahl größer als die rechte ist. Der Rest der Zeile bleibt stehen. Dann erfolgt ein neuer Durchlauf der For Next Schleife , bei dem nichts passiert da in Position ar[1] des Arrays jetzt 13 steht und 13 < 15 ist. ( das Array beginnt mit der zahl 0 und hört mit n-1 auf, wenn es n Elemente hat. Beim nächsten Durchlauf der For Next Schleife wird die Position ar[2] = 15 mit ar[3] = 11 verglichen . Da 15 > 11 wird getauscht. Dann ist die For next Schleife das erste Mal zu Ende, da j = 3 = n-2 und die Repeatschleife wird ein zweites mal durchlaufen an, denn der Hilfsparameter c zeigt einen stattgefundenen Tausch an. Und so geht das immer weiter bis c = 0 , d.h. keine Vertauschung mehr nötig war.

Ripplesort mit Zufallszahlen[Bearbeiten]

Das folgende Programm ist vom obigen abgeleitet. Erst werden per Zufall 5 Zahlen zwischen 1 und 5 erzeugt. Diese werden dann sortiert. Sie brauchen eine Textarea und 2 Commandbuttons, um das Programm in Gang zu bringen.

' Gambas class file
ar AS Integer[]
PUBLIC SUB Form_Open()
'schon beim Öffnen der Form wird der Array mit lauter Nullen gefüllt.
x AS Integer
ar = NEW Integer[]
ME.Text = "Sortieren"
FOR x = 0 TO 4
  ar.Add(Str(0))
NEXT
END
PUBLIC SUB Button1_Click()
x AS Integer 
r AS Integer 
element AS Integer 
txt AS String
z AS Integer 
txt = ""
'der Array wird komplett auf Null gestellt
FOR x = 0 TO 4
 ar[x] = 0 
NEXT
Randomize() 
FOR x = 0 TO 4
 r = Int(Rnd(1,6))
ar[x] = r
NEXT 
x = 0 
FOR EACH element IN ar 
PRINT x,element
txt = txt & x & "  " & element & Chr(10) 
 x = x + 1
NEXT
textarea1.Text = txt 
END
PUBLIC SUB Button2_Click()
c AS Integer 
j AS Integer 
n AS Integer 
y AS Integer 
element AS Integer 
txt AS String 
y = 0
n = ar.count 
REPEAT 
c = 0
FOR j = 0 TO n - 2
  PRINT j,y,ar[0],ar[1],ar[2],ar[3],ar[4]
  IF ar[j] > ar[j + 1] THEN 
    y = ar[j] 
    ar[j] = ar[j + 1]
    ar[j + 1] = y 
    c = 1
  ENDIF 
NEXT 
UNTIL c = 0 
FOR EACH element IN ar 
txt = txt & element & Chr(10) 
NEXT
textarea1.Text = textarea1.Text & txt 
END

Zahlenliste beliebiger Länge durchsortieren[Bearbeiten]

Im folgenden Beispiel wird der Ripplesort-Algorithmus zum Sortieren einer beliebig langen Werteliste benutzt. Sie brauchen 2 Textareas und 2 Commandbuttons, um das Programm in Gang zu bringen.

Code:

' Gambas class file
PUBLIC SUB Button1_Click()
c AS Integer 
j AS Integer 
n AS Integer 
y AS Variant
DIM Liste AS String[]
element AS String 
txt AS String 
text AS String 
text = Textarea1.Text
liste = Split(text,Chr(10))
y = 0
n = liste.length
REPEAT 
c = 0
 FOR j = 0 TO n - 2
   'PRINT j,y,liste[0],ar[1],ar[2],ar[3],ar[4]
   IF Val(liste[j]) > Val(liste[j + 1]) THEN 
     y = Val(liste[j]) 
     liste[j] = liste[j + 1]
     liste[j + 1] = Str(y) 
     c = 1
   ENDIF 
 NEXT 
UNTIL c = 0 
FOR EACH element IN liste 
txt = txt & Str(element) & Chr(10) 
NEXT
'PRINT txt
textarea2.Text = ""
textarea2.Text = txt
END
PUBLIC SUB Button2_Click()
'Beispielliste
 textarea1.Text = "114,3"
 textarea1.Text = textarea1.Text & Chr(10) & "135,7"
 textarea1.Text = textarea1.Text & Chr(10) & "104,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,5"
 textarea1.Text = textarea1.Text & Chr(10) & "125,7"
 textarea1.Text = textarea1.Text & Chr(10) & "121,4"
 textarea1.Text = textarea1.Text & Chr(10) & "122,4"
 textarea1.Text = textarea1.Text & Chr(10) & "96,8"
 textarea1.Text = textarea1.Text & Chr(10) & "118,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120"
 textarea1.Text = textarea1.Text & Chr(10) & "112,2"
 textarea1.Text = textarea1.Text & Chr(10) & "127,9"
 textarea1.Text = textarea1.Text & Chr(10) & "122,8"
 textarea1.Text = textarea1.Text & Chr(10) & "128,9"
 textarea1.Text = textarea1.Text & Chr(10) & "120,3"
END