Also, meine "Optimierung" des Bubblesorts bestand zunächst nur darin, statt der Vertauschungen zyklische Verschiebungen durchzuführen, das verringerst die Anzahl der Verschiebungen (jeder Tausch wird ja schließlich mit zyklischer (3er)Verschiebung realsisiert). Das ist natürlich nicht adaptiv gegenüber (vor-)sortierten Startmengen. Bubblesort ist dermaßen niedrig im algorithmischen Niveau, daß ich über weitere Verbesserungen nicht nachdachte. Grundsätzlich läßt sich ja in jeden (m.E. nicht nur vergleichsbasierten, sondern wirklich vor jeden) Sortieralgorithmus eine Anfangsprüfschleife, die die "Schon-Sortiertheit" überprüft, implementieren.
Eine runde Stunde (erstaunlich, wie das schnöde Bubblesort einen beschäftigen kann) benötigte ich, um die hier erwähnten Optimierungen einzubauen.
Mein - nunmehr adaptives, also i.S.v. (Vor-)Sortierungen "intelligentes" - Bubblesort fängt bei kompletter Sortiertheit zum Begin gar nicht erst richtig an (eben nur Prüfung und dann Ende) und ist bei Vorsortierungen schneller fertig, weil es die Sortiertheit erkennt und daraufhin abbricht; es sieht nun so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
|
for x:=0 to Elementeanzahl-2 do begin p:=true;
z_sortierelement:=Menge[pred(Elementeanzahl)]; for y:=pred(Spaltenanzahl) downto succ(x) do if Menge[pred(y)].schluessel>z_sortierelement.schluessel then begin Menge[y]:=Menge[pred(y)]; p:=false end else begin if not p then Menge[y]:=z_sortierelement; z_sortierelement:=Menge[pred(y)] end; if p then break; Menge[x]:=z_sortierelement end; |
Edit: Wie der Algorithmus des Diskussionseröffners sortieren soll, ist mir nach wie vor schleierhaft. Natürlich kann man äußerlich eine while- oder repeat-Schleife implementieren, um den Abbruch zu erleichtern (ich benutzte break), dennoch benötigt man zwei ineinandergeschachtelte Zähl- oder wenigstens zählende Schleifen für Bubblesort. Das kann so nicht sortieren, meine ich also weiterhin.
Edit 2: Die innere Schleife kann/könnte im Verlaufe der Sortierung immer kürzere Bereiche der Sortiermenge durchlaufen, weil der sortierte Anteil der Menge im Verlaufe der Sortierung immer mehr zunimmt (es gibt auch Sortierungen, die umgekehrt arbeiten, indem diese die Sortiermenge insgesamt allmählich immer mehr sortieren). Deshalb wird die innere Zählschleife unnötig oft durchlaufen.