Forum: Projekte & Code Sortieralgorithmus Bubble-Sort in 8051-Assembler


von Wilhelm F. (Gast)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wilhelm Ferkes schrieb:
> Der Bubble-Sort funktioniert ausgezeichnet, wenn auch ich in
> Internetseiten fand, daß er eher nur zu Lehrzwecken eingesetzt wird

Was nicht heißt das es nicht funktioniert... Die Laufzeit ist nur (im 
Vergleich zu anderen Verfahren) für Große Datenmengen halt ungünstig.

von Wilhelm F. (Gast)


Lesenswert?

Läubi .. schrieb:

> Wilhelm Ferkes schrieb:
>> Der Bubble-Sort funktioniert ausgezeichnet, wenn auch ich in
>> Internetseiten fand, daß er eher nur zu Lehrzwecken eingesetzt wird
>
> Was nicht heißt das es nicht funktioniert... Die Laufzeit ist nur (im
> Vergleich zu anderen Verfahren) für Große Datenmengen halt ungünstig.

Ich arbeite noch an den Dingen, z.B. Quicksort oder Shellsort. Für 
vieles an meinem 8051 reicht aber der Bubble-Sort. Keine Frage. 5 
Elemente sortiert der auch in weniger als 100µS. Sagen wir mal für 5 
Sortierelemente. Darüber steigt es dann mindestens quadratisch in 
Laufzeit, deswegen muß man sich dann was besseres als den Bubble-Sort 
nehmen.

Es stellt sich mir gerade ein ganz neuer Aspekt: Daten in einem 8-bit-µC 
sortieren, die vielleicht 32 bit haben. Da würde ich die Funktion 
COMPARE mit skalierbarer Bytelänge aufrufen, die auch nur aus wenigen 
Zeilen besteht, die ein Carry-Flag zurück gibt.

Das geht alles, auch auf einem 8-bitter. Keine Frage.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.