Sortieralgorithmus Bubble-Sort in 8051-Assembler

Gast #2817958
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.
Gast #2818999
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren