' --- Quicksort --- $I classh.inc ' Klassendefinitionen einfügen (Include) window 400,600 declare a![] declare lb# ' lb# nimmt Adresse/Handle des Objekts auf ' neues Objekt der Klasse: lablist mit x,y,Breite,Höhe,Überschrift lb# = new(lablist,100,5,200,500,"Quicksort") randomize whileloop 0,250 a![&loop]= 2000 *rnd() - 750 ' array mit Zufallszahlen füllen endwhile quicksort(a![],0,250) ' Prozeduraufruf whileloop 0,250 lb#.setbottom (str$(&loop)+ ". " + str$(a![&loop]))' Wert anhängen (Methode) endwhile waitinput dispose lb# ' Speicherplatz des Objekts freigeben proc quicksort parameters a![], l%, r% ' l=links, r=rechts if l% < r% ' solange mehr als 1 Element in Teilfeld var i% = l% -1 ' Teilfeldrand (-1 da inc vor Vergleich) var j% = r% ' rechtes Element ist Trennelement(dec vor Vergleich) var tmp! = 0 ' Zwischenspeicher zum Tauschen ' Trennelement/ Pivotelement: rechtes Element repeat ' Schleife, bricht ab, wenn i>=j ' bis größeres/gleiches Element gefunden wird: linke Marke verschieben repeat inc i% ' zuerst inkrementieren until a![i%]>=a![r%] ' bis kleineres/gleiches Element gefunden wird: rechte Marke verschieben repeat dec j% ' zuerst dekrementieren until (a![j%]<=a![r%]) or (i%>=j%) ' oder Zeiger sich treffen/überlaufen case (i%>=j%) : break ' bricht ab, wenn Zeiger sich überlaufen tmp!=a![i%]: a![i%]=a![j%]: a![j%]=tmp! ' tauschen until 0 ' 0 bedeutet falsch, Schleifenabbruch nur bei break tmp!=a![i%]: a![i%]=a![r%]: a![r%]=tmp! 'tausche das Trennelement quicksort(a![], l%, i%-1) ' rekursiver Aufruf für linkes Teilfeld quicksort(a![], i%+1, r%) ' rekursiver Aufruf für rechtes Teilfeld endif endproc