Einfacher Bubblesort Algorythmus Tutorial

      Einfacher Bubblesort Algorythmus Tutorial

      Hallo

      Ich mache hier ein kleines Tutorial zu dem Bubblesort Algorythmus(Sortierungscode),man verwendet Ihn wenn man etwas sortieren will.


      Als erstes erstellen wir ein objekt mit namen obj_sort ,das fügen wir gleich in den room ein.

      Dann erstellen wir ein Create Event ,in dem wir dem User die Möglichkeit geben Zahlen einzutippen.(Und diese Zahlen werden dann sortiert!)


      Wir erstellen ein Create Event mit diesem Code:

      GML-Quellcode

      1. I = 0; //Wir erstellen eine Variable namens i mit dem Wert 0 zum steuern des Arrays (Arrays könnt ihr euch als Schubladen vorstellen,in jeder kann man was eigenes rein tun)
      2. repeat(5) // Hier erstellen wir eine Repeat Schleife damit der unten aufgeführte Code 5 mal ausgeführt wird
      3. {
      4. number[i]= get_string("Zahl",""); //Zuerst erstellen wir ein Array mit dem Namen number[] und fügen die Variable i ein (number[i]),das bedeuted das Array beginnt bei 0
      5. i++; // Hier lassen wir die Variable i nach jedem durchgang eins hochzählen.(das heißt am ende hat das Array 5 Schubladen,,, also von 0 -4 )
      6. }



      Nun haben wir die Usereingabe erstellt.
      Jetzt kommen wir zum Sortierungsalgorythmus.Dafür erstellen wir ein Step Event mit diesem Code

      GML-Quellcode

      1. var pos = array_length_1d(number); //Hier erstellen wir eine Lokale Variable namens pos(Lokale Variablen sind nur im selben Event verfügbar),und geben ihr den Wert des Arrays, array_length_id sieht nach wie gross das Array ist also wieviel Schubladen es hat,in diesem Fall 5.
      2. for (i = 0;i < pos;i++) // Hier erstellen wir eine For Schleife,For Schleifen sind ähnlich der Repeat Schleife nur das hier eine Variable deklariert wird also( i = 0; ) dann eine Bedingung wie bei einer if abfrage (i<pos) ,die bedingung bedeutet also 0 < 5. dann zu guter letzt nur das increasen also erhöhen des Wertes der Variable i. das heißt diese For Schleife rennt insgesamt 5 mal
      3. {
      4. for(s = pos-1;s > i;s--) //Und hier wieder ne For schleife nur das wir bei der Variable pos-1 steht.(das bedeutet das die letzte position vom Array gemeint ist also 5) ,dann kommt wieder die bedingung dieses mal s > i also 5>0, und dann wird decreased also heruntergezählt von dem wert der Variable s also 4
      5. {
      6. if (number[s]>number[s-1]) //Hier haben wir eine If Abfrage also Wenn Abfrage in der wir abfragen ob das Array number[s]>number[s-1] also number[5]>number[4] denn hier heißt das s-1 nicht wieder die letzte position im array da s ja schon pos-1 ist.
      7. {
      8. temp = number[s]; // hier erstellen wir eine Variable in der wir die größere Zahl speichern damit sie nicht verloren geht
      9. number[s]=number[s-1]; // dann geben wir number[s] den Wert von number[s-1] also den niedrigeren Wert. (Da wir in der IF Bedingung geschrieben haben (number[s]>number[s-1])
      10. number[s-1]=temp; // und zu guter letzt geben wir number[s-1] den Wert von temp wo die größere Zahl gespeichert ist. Und das läuft solange durch bis alles geordnet ist von groß zu klein.
      11. }
      12. }
      13. }





      Zu guter letzt brauchen wir noch ein Draw Event in dem wir die Zahlen drawen lassen:

      GML-Quellcode

      1. for (I=0;i < 5;i++) // Hier benötigen wir wieder eine For Schleife da wir alle Schubladen des Arrays also den Wert drawen lassen wollen
      2. {
      3. draw_text(x+100,y+50*i,number[i]); // hier ganz normal draw_text funktion nur bei y wird *i gemacht damit es untereinander in 50 pixel abständen 5 mal geschrieben wird. und dann noch das Array number[] und fügen auch die Variable i wieder ein damit vom 0-4 gedrawt wird.
      4. }




      Ich hoffe ihr versteht alles.Wenn nicht ich helfe euch gerne,und es gibt sicherlich noch genug andere User die auch helfen würden.
      Und jetzt könnt ihr in testen.Jedoch müsst ihr bei der Usereingabe wenn ihr einen Wert unter 10 eingeben wollt eine 0 davor schreiben also zb 02. oder 07

      acidrain833 schrieb:

      oje das kannte ich garnicht..muss ich mir mal ansehn...aber anscheinend wird das ja das selbe machen oder?


      Naja bei dem Code jetzt besteht dein Array aus Strings und würde Fehler werfen. Deshalb ist get_integer(...) die einfachere / bessere Lösung.

      Ich finde das Tutorial sehr schön :)
      Wenn ich darf, möchte ich aber gerne noch auf weitere Dinge hinweisen.

      Beim ersten Code könntest du auch eine For-Schleife nutzen. Das blödere bei diesem Code ist, dass du beim initialisieren von i das i groß, sonst aber klein, geschrieben hast.

      Im zweiten Code finde ich die Variable pos sehr unpassend. Sowas wie len würde da eher passen.
      Im Kommentar dahinter steht dann auch array_length_id es sollte aber array_length_1d heißen.
      Bei dem Kommentar nach der For-Schleife könnte es bei die bedingung bedeutet also 0 < 5 (gibt hier von mehr) für Verwirrung sorgen, da diese Aussage nur für das erste Mal gilt. Schreibe da am besten sowas wie "bspw." dazu.

      Im DrawCode hast du I wieder groß geschrieben.

      acidrain833 schrieb:

      Jedoch müsst ihr bei der Usereingabe wenn ihr einen Wert unter 10 eingeben wollt eine 0 davor schreiben also zb 02. oder 07

      Das kann ich nicht nachvollziehen.

      Sorry, die Kritik sollte nicht ärgern oder ähnliches, aber ich finde Tutorials sollten eine gewisse Quallität haben, da sonst außenstehende evtl. an dem Code verzweifeln.

      Vielleicht ganz Interessant wäre es, wenn du noch erklärst, wie und warum der genau funktioniert ;)
      Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
      Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

      Willst du mit mir auf Discord Chatten/Quatschen?
      Meine Husi's Tutorial Reihe
      Hey, kleine Sache die mir am Rande aufgefallen ist. Du hast ab und zu die Variable "I" groß geschrieben.
      Das führt zwar zu keinem Fehler, aber der Sauberkeit zur Liebe gibt es bei Variablen bestimmte Normen, an die man sich halten sollte.

      Darunter zählen:
      - Variablen immer klein schreiben
      - Nie eine Variable mit einer Zahl beginnen
      - Umlaute wie ö, ä, ü oder auch ß vermeiden bzw. umschreiben in oe, ae, ue, ss
      - Variablen möglichst kurz halten und so definieren, dass man weiß, was diese bewirkt. Bei einer Zählervariable ist das natürlich eher weniger wichtig.
      - Bei zusammengesetzen Variablen wie bspw. rotesAuto immer das erste Wort klein und vom zweiten Wort den ersten Buchstaben groß (oder Variante 2 durch einen Unterstrich trennen: rotes_auto)

      Das ist kein Muss, wäre aber sinnvoll für die Übersicht in deinem Code