In diesem Schnelltipp zeige ich Ihnen, wie und warum der Bubble Sort-Algorithmus funktioniert und wie er in AS3 implementiert wird. Am Ende erhalten Sie eine Klasse, die Sie in jedem Flash-Projekt zum Sortieren von Arrays verwenden können.
Hier ist eine einfache Demo des Ergebnisses des Blasensortieralgorithmus:
Natürlich ist diese SWF nicht viel wert! Holen Sie sich die Quelldateien und Sie können das Eingabe-Array selbst bearbeiten.
Da dieser Algorithmus mehr als einmal verwendet wird, ist es eine gute Idee, eine Klasse für ihn zu erstellen, damit wir ihn problemlos in jedem AS3-Projekt verwenden können:
Richten Sie ein einfaches Flash-Projekt ein und erstellen Sie im Projektordner eine Datei BubbleSort.as. (Wir werden auch hier eine Testerdatei erstellen, damit wir sie testen können.)
Wenn Sie nicht wissen, wie Sie mit Klassen arbeiten, lesen Sie dieses Tutorial: So verwenden Sie eine Dokumentklasse in Flash.
Wir brauchen den Konstruktor nicht, also los damit! Ihre Klasse sollte so aussehen:
Paket öffentliche Klasse BubbleSort
Dieser Algorithmus ist nicht die schnellste oder effizienteste Methode zum Sortieren einer Zahlenreihe, aber er ist am einfachsten zu verstehen.
Dieses Bild fasst es zusammen; In jeder Phase wird jedes Zahlenpaar vom Ende aus verglichen und ausgetauscht (mittels eines "Ersatzteils"). Temp
Variable), wenn sie in der falschen Reihenfolge sind.
Wenn alle aufeinanderfolgenden Paare überprüft wurden, wird garantiert, dass die Nummer am Anfang die größte Nummer in der Sequenz ist. Wir wiederholen es und überprüfen jedes Zahlenpaar abgesehen von der Nummer am Start. Sobald alle aufeinanderfolgenden Paare geprüft wurden, wissen wir, dass das erste zwei Zahlen in der Reihenfolge sind in der richtigen Reihenfolge (sie sind die größten und zweitgrößten). Wir machen weiter, bis wir alle Zahlen in der richtigen Reihenfolge eingegeben haben.
Sie wird als "Bubblesort" bezeichnet, da bei jedem Durchlauf durch das Array die größte Zahl wie eine Blase im Wasser an die Spitze des Arrays "schwebt".
Lasst uns den Code schreiben. Wir nennen die Hauptfunktion bsort ()
:
package public class BubbleSort öffentliche Funktion bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descending") else if (sortType.toLocaleLowerCase () == "ascending") else werfen neuen Fehler ("Sie haben einen Tippfehler beim Aufruf der Funktion bsort (), bitte Verwenden Sie 'aufsteigend' oder 'absteigend' für sortType! "); zurück Arr;
Die Funktion erhält zwei Parameter. Der erste Parameter, arr
, wird das zu sortierende Array sein; der zweite Parameter, sortType
wird verwendet, um zu entscheiden, ob der Benutzer das Array in aufsteigender oder absteigender Reihenfolge sortieren möchte.
In der Funktion deklarieren wir a Temp
Variable, die die Elemente des Arrays enthält, falls die beiden Elemente ausgetauscht werden müssen. Sie fragen sich vielleicht, warum es keine Zahl ist. Dies liegt daran, dass unsere Klasse auch String-Arrays verarbeiten und alphabetisch sortieren kann. Wir können Zahlen in Strings und zurück konvertieren, aber wir können Strings nicht in Zahlen und zurück konvertieren. Daher verwenden wir einen String für diese Variable, um sicherzugehen.
Wir benutzen ein ob
-sonst
blockieren, um unseren Code in zwei Zweige aufzuteilen, abhängig davon, in welche Richtung der Benutzer sortieren möchte. (Wenn der Benutzer keine gültige Auswahl gibt, löst das Programm einen Fehler aus.)
Der Unterschied zwischen den Codes in den beiden Verzweigungen ist nur ein Zeichen: entweder <
oder >
.
Schreiben wir den Algorithmus. Wir beginnen mit dem absteigenden Teil:
package public class BubbleSort öffentliche Funktion bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descending") für (var i: uint = 0; i < arr.length; i++) for(var j:uint=arr.length-1; j > ich; j--) else if (sortType.toLocaleLowerCase () == "ascending") else throw new Fehler ("Sie haben einen Tippfehler beim Aufruf der Funktion bsort ()), verwenden Sie" ascending "oder" descending " 'für sortType! "); zurück Arr;
Wie Sie sehen, verwenden wir verschachtelt zum
Schleifen Man geht vom ersten bis zum letzten Element des Arrays; der andere geht rückwärts.
Lass uns das Innere prüfen "j
"Schleife zuerst. Wie das vorhergehende Diagramm zeigt, vergleichen wir zunächst die letzten beiden Elemente des Arrays arr [j-1]
und arr [j]
(in der ersten Iteration). Ob arr [j-1]
ist weniger als arr [j]
Sie müssen ausgetauscht werden.
In beiden Fällen ziehen wir eine davon ab j
(durch die "j--
"Aufruf in Zeile 131), wodurch geändert wird, welches Zahlenpaar in der nächsten Schleife verglichen wird.
j
beginnt mit einem Wert von Arr.Länge-1
, und endet mit einem Wert von 1
, was bedeutet, dass das Innere zum
Die Schleife prüft jedes aufeinanderfolgende Paar, beginnend mit dem letzten Paar (wo j
gleich Arr.Länge-1
) und endet mit dem ersten Paar (wo j
gleich 1
).
Jetzt schauen wir uns das äußere anich
"Schleife. Sobald alle Paare geprüft und bei Bedarf ausgetauscht wurden, ich
wird erhöht (durch die "ich++
"Anruf in Zeile 129). Dies bedeutet, dass die nächste Zeitrunde, j
fängt um an Arr.Länge-1
wieder, aber enden bei 2
Diesmal bedeutet dies, dass das erste Paar in der Sequenz nicht überprüft oder ausgetauscht wird. Das ist genau das, was wir wollen, da wir wissen, dass sich die erste Zahl in der richtigen Position befindet.
Im weiteren Verlauf werden schließlich nur noch zwei Elemente in der inneren Schleife geprüft. Sobald sie fertig sind, wissen wir, dass wir das Array sortiert haben!
So sieht das im Code aus:
für (var i: uint = 0; iich; j--) if (arr [j-1] < arr[j]) temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp;
Und der Algorithmus ist fertig!
Jetzt können wir dieselbe Logik verwenden, um die aufsteigende Sortierung zu erstellen:
Wir müssen nur den Vergleichsoperator im if-Block der inneren Schleife ändern:
package public class BubbleSort öffentliche Funktion bsort (arr: Array, sortType: String): Array var temp: String; if (sortType.toLocaleLowerCase () == "descending") für (var i: uint = 0; iich; j--) if (arr [j-1] < arr[j]) temp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = temp; else if(sortType.toLocaleLowerCase() == "ascending") for(var k:uint=0; k k; l--) if (arr [l-1]> arr [l]) temp = arr [l-1]; arr [l-1] = arr [l]; arr [l] = Temp; else werfen neuen Fehler ("Sie haben einen Tippfehler beim Aufruf der Funktion bsort (), verwenden Sie für sortType bitte 'ascending' oder 'descending'!"); return arr;
Erstellen Sie eine neue Flash-Datei, tester.fla, im selben Ordner wie BubbleSort.as. Erstellen Sie zwei dynamische Textfelder, nennen Sie eins input_arr und die andere output_arr.
Nachdem Sie das Erscheinungsbild erstellt haben, müssen Sie die Dokumentklasse erstellen und verknüpfen.
Erstellen Sie eine Datei Tester.as und verlinke das mit tester.fla
Jetzt können wir unsere Klasse endlich in der Tester.as verwenden:
Paket Import BubbleSort; import flash.display.MovieClip; public class Tester erweitert MovieClip private var bs: BubbleSort = new BubbleSort (); öffentliche Funktion Tester () var ar: Array = [5,7,9,8,1,3,6,2,4,5,0]; input_arr.text = ar.toString (); ar = bs.bsort (ar, "absteigend"); output_arr.text = ar.toString ();
In dieser Zeile nennen wir das bsort ()
Funktion unserer Variablen bs
(was eine Instanz von BubbleSort
):
ar = bs.bsort (ar, "aufsteigend");
Diese Funktion gibt ein Array zurück, sodass wir dieses als neuen Wert unseres ursprünglichen Eingangsarrays zuweisen können.
Speichern Sie alles und probieren Sie Ihr Training aus.
In diesem Lernprogramm haben wir eine Funktion erstellt, mit der wir ein Array sortieren können. Wir könnten die Effizienz verbessern; Weitere Informationen hierzu finden Sie in Wikipedia - Bubble Sort
Wenn Sie wirklich sehen möchten, wie schnell dieser Algorithmus im Vergleich zu anderen Optionen (wie etwa quicksort) ist, werfen Sie einen Blick auf sorting-algorithms.com.