Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Arrays sortieren mit Bubblesort

Gefällt Ihnen Ihr Programm soweit? Zugegeben, es wäre noch schöner, wenn die Zahlen sortiert ausgegeben würden, so wie das auch am Ende bei der Ziehung der Lottozahlen im Fernsehen passiert. Obwohl ein NSMutableArray mit nur wenigen Anweisung sortiert werden kann, wollen wir zunächst darauf verzichten und die Liste manuell sortieren.
Um Auflistungen, wie in diesem Fall ein NSMutableArray, zu sortieren, verwendet man in der Informatik gelegentlich ein als Bubblesort bekanntes Verfahren. Es gibt unzählige andere, aber Bubblesort ist eines der bekanntesten und wahrscheinlich auch das einfachste. Bei diesem Algorithmus werden nacheinander immer zwei Objekte einer Auflistung verglichen und anschließend vertauscht, wenn sie von den Werten nicht der beabsichtigten Sortierreihenfolge entsprechen. Jeder Programmierer sollte in der Lage sein, einen Bubblesort ohne viel Mühe zu programmieren.
Will man jeweils ein Objekt einer Auflistung mit seinem Nachbarobjekt vergleichen, ist dies mit einer for-Schleife leicht realisierbar. Der Endwert der Schleife ist die Länge des Array minus Eins, denn das letzte Objekt hat kein nachfolgendes Objekt mehr, mit dem es verglichen werden könnte. Innerhalb der Schleife wird die compare-Methode von NSNumber benutzt, um zu prüfen, ob die zwei Werte schon in der richtigen Reihenfolge angeordnet sind. Ist dies nicht der Fall, müssen sie getauscht werden. Die aZahl nimmt den Platz von bZahl an und umgekehrt.
Schreiben Sie den folgenden Anweisungen nach der for-Schleifen zum Erzeugen der sechs Zufallszahlen, aber noch vor der Ausgabe der Werte in den Textfeldern.
NSNumber *aZahl;
NSNumber *bZahl;

for (int i = 0; i < zufallsArray.count - 1 ; i++)
{
    aZahl = zufallsArray[i];
    bZahl = zufallsArray[i+
1];

    // Die Werte tauschen wenn die Reihenfolge nicht korrekt ist.

    if
([aZahl compare:bZahl] == NSOrderedDescending)
    {
        [zufallsArray
replaceObjectAtIndex:i+1 withObject:aZahl];
        [zufallsArray
replaceObjectAtIndex:i withObject:bZahl];
    }
}
Beim Bubble Sort kann ein Objekt maximal eine Position pro Durchlauf wandern. Der ungünstigste Fall wäre also, dass ein Objekt vom Ende der Auflistung zum Anfang verschoben werden muss. Dafür benötigt man eine zweite for-Schleife, die so viele Durchläufe macht, wie Objekte in der Auflistung sind. Der gesamte Sortieralgorithmus sieht im Zusammenhang dann so aus:
// Sortieren mit Bubblesort

NSNumber *aZahl;
NSNumber *bZahl;

for (int i = 0; i < zufallsArray.count - 1 ; i++)
{
    for (int i = 0; i < zufallsArray.count - 1 ; i++)
    {
        aZahl = zufallsArray[i];
        bZahl = zufallsArray[i+1];

        if ([aZahl compare:bZahl] == NSOrderedDescending)
        {
            [zufallsArray replaceObjectAtIndex:i+1 withObject:aZahl];
            [zufallsArray replaceObjectAtIndex:i withObject:bZahl];
        }
    }
}
stacks_image_D3DDF990-D65A-435E-9464-E8D8424B5F79
Obwohl diese Anwendung in seiner jetzigen Form fehlerfrei arbeitet, bieten sich noch einige Möglichkeiten, den Programmcode zu optimieren. So ist es zum Beispiel möglich, Objekte im Array mit nur einem einzigen Befehl zu vertauschen.
[zufallsArray exchangeObjectAtIndex:i withObjectAtIndex:i+1];
Ebenfalls unnötig ist es, Objekte aus dem NSMutableArray zuvor den Variablen aZahl und bZahl zuzuweisen. Möchte man zwei Objekte im Array vergleichen, geht das auch anders.
if ([zufallsArray[i] compare: zufallsArray[i+1]] == NSOrderedDescending)
{
    [zufallsArray exchangeObjectAtIndex:i withObjectAtIndex:i+1];
}
Der vollständige, auf das Wesentliche reduzierte Programmcode ist dann:
for (int i = 0; i < zufallsArray.count - 1 ; i++)
{
    for (int i = 0; i < zufallsArray.count - 1 ; i++)
    {
        if ([zufallsArray[i] compare: zufallsArray[i+1] == NSOrderedDescending)
        {
            [zufallsArray exchangeObjectAtIndex:i withObjectAtIndex:i+1];
        }
    }
}