So, die Herrschaften. Ich habe im Betreff mal den Namensteil "Sortier",
damit man es in der Forensuche findet.
Der Bubble-Sort funktioniert ausgezeichnet, wenn auch ich in
Internetseiten fand, daß er eher nur zu Lehrzwecken eingesetzt wird.
Aber das ist nur die halbe Wahrheit, in meinen Applikationen tut der es
sehr gut:
1 | .if BUBBLE_SORT_USED
|
2 |
|
3 | ; Bubble Sort Sortierprogramm
|
4 |
|
5 | ; Vom aufrufenden Programm werden uebergeben:
|
6 |
|
7 | ; R2 enthaelt Adresse der Bytekette
|
8 | ; R3 enthaelt Laenge der Bytekette
|
9 |
|
10 | ; Hier verwendet werden:
|
11 |
|
12 | ; R0 ist Zeiger auf LSB der Bytekette
|
13 | ; R1 ist Zeiger auf LSB+1 der Bytekette
|
14 | : R4 innere Schleife
|
15 | ; ACC ist Arbeitsregister
|
16 |
|
17 | ; Ist die Byteanzahl kleiner als 2, wird das Programm vorher beendet.
|
18 |
|
19 | ; Die aufsteigende Sortierreihenfolge kann auf einfache Weise geaendert
|
20 | ; werden, wenn man den bedingten Sprung beim Groeßenvergleich um kehrt,
|
21 | ; also das Carry-Flag negiert bzw. den komplementaeren Befehl verwendet.
|
22 |
|
23 | BUBBLE_SORT:
|
24 | MOV A, R3 ; teste auf Anfangslaenge
|
25 | DEC R3 ; n-1 Durchlaeufe
|
26 | SETB C
|
27 | SUBB A, #1
|
28 | JC BUBBLE_SORT_ENDE ; Ende, wenn Anzahl zu klein
|
29 | BUBBLE_SORT_RE_INIT:
|
30 | MOV A, R2 ; Adressen der beiden Operanden
|
31 | MOV R0, A ; in ein Zeigerregister umladen
|
32 | INC A
|
33 | MOV R1, A
|
34 | MOV A, R3 ; Anzahl der restlichen Durchlaeufe
|
35 | MOV R4, A
|
36 | BUBBLE_SORT_LOOP:
|
37 | CLR C
|
38 | MOV A, @R0
|
39 | SUBB A, @R1
|
40 | JC BUBBLE_SORT_LOOP_2; wenn R1 > R0: nicht tauschen!
|
41 | XCH A, @R0 ; sonst tauschen!
|
42 | XCH A, @R1
|
43 | XCH A, @R0
|
44 | BUBBLE_SORT_LOOP_2:
|
45 | INC R0
|
46 | INC R1
|
47 | DJNZ R4, BUBBLE_SORT_LOOP
|
48 | DJNZ R3, BUBBLE_SORT_RE_INIT
|
49 | BUBBLE_SORT_ENDE:
|
50 | RET
|
51 |
|
52 | .endif ; if BUBBLE_SORT_USED
|
Der Quicksort scheint besser, habe den noch nicht ganz durchschaut.
Der hier gezeigte Code arbeitet aber schon diagonal, es wird pro
Durchlauf ein Element weniger verarbeitet, weil nach einem Durchlauf
immer ein Element schon sortiert ist.
Ganz ausgefeilt ist er nicht, man könnte in der Schleife noch fest
stellen, ob eine Reihe Elemente bereits sortiert sind, und dann
abbrechen.
Nun ja, in Assembler ist das sowieso hypergalaktisch schnell.
Es kann und darf noch optimiert werden.
Ob man die Funktion reentrant macht oder nicht, da gibt es eben einige
Möglichkeiten.