C 64
Kurs

Neues zum Thema Sortieren

Die Krönung unseres Sortierkurses. Wir stellen Ihnen heute zwei optimierte Quicksort-Routinen in Basic und in Maschinensprache vor.

In Listing 1 sehen Sie die Quicksort-Version von Kurt Sörensen, die ein Feld von 100 Elementen in nur noch 20 Sekunden sortiert, was eine Verkürzung der Sortierzeit um knapp 35 Prozent zur letzten Quicksort-Version bedeutet. Eine solche Sortierzeit ist natürlich von Programmen, wie Mischsort oder Supersort nicht mehr zu schlagen, weshalb wir an dieser Stelle nochmals ausdrücklich die Behauptungen in früheren Heften redigieren müssen, es gäbe ein schnelleres Sortierprogramm als Quicksort (Programme für Spezialanwendungen dürfen in diesem Wettbewerb natürlich nicht antreten; hier zählt einzig und allein der Grundgedanke eines Sortieralgorithmus, der ohne Zusätze oder »Tuning« geprüft wird).

10000 rem super-quicksort
10010 dimlg(100),rg(100):ti$="000000":lg(1)=1:rg(1)=a:z=0:gosub10012
10011 goto50000
10012 z=z+1:iflg(z)>=rg(z)then10025
10013 x=lg(z):y=rg(z):ify<=x+1then10021
10014 b=int(x+y)/2:vg$=a$(b)
10015 ifx>ythen10023
10016 ifa$(x)<vg$thenx=x+1:goto10016
10017 ifa$(y)>vg$theny=y-1:goto10017
10018 ifx>ythen10023
10019 s$=a$(x):a$(x)=a$(y):a$(y)=s$
10020 x=x+1:y=y-1:goto10015
10021 ifa$(x)<=a$(y)then10025
10022 s$=a$(x):a$(x)=a$(y):a$(y)=s$:goto10025
10023 rg(z+1)=y:lg(z+1)=lg(z):gosub10012
10024 lg(z+1)=rg(z+1)+1:rg(z+1)=rg(z):gosub10012
10025 z=z-1:return
Listing 1. Das »Super-Quicksort«. Dieses Programm ist um zirka 35 Prozent schneller als das vorhergehende Quicksort.

Nun zu einigen speziellen Problemen, die vielfach aufgetreten sind. Wir wollen an dieser Stelle einmal einige Antworten und Lösungsvorschläge geben.

Das Problem mit mehrdimensionalen Feldern

Zuerst zum Problem des Sortierens mehrdimensionaler Felder. Hier kamen einige Anfragen, die sich generell mit diesem Problem beschäftigten. An dieser Stelle muß dazu gesagt werden, daß es eine allgemeingültige Lösung nicht gibt; und zwar aus folgendem Grund: Ein mehrdimensionales Feld hat computerintern eine gewisse Reihenfolge, in der die Elemente abgelegt werden (siehe Bild 1). Nach dieser Reihenfolge könnte man ohne weiteres sortieren. Mehrdimensionale Felder werden jedoch in der Regel hierarchisch nach ganz anderen Gesichtspunkten sortiert, wobei in jeder Dimension des Feldes eine andere Art von Daten abgelegt werden (siehe Bild 2).

Wollten Sie ein solches Feld, wie in Bild 2 dargestellt, sortieren, so bräuchten Sie für jede Anwendung ein Spezialsortierprogramm, das auf die ganz bestimmten Eigenheiten Ihres Feldes zugeschnitten ist. Im Prinzip ist es in so einem Fall einfacher, das gesamte Datenfeld in eindimensionale Felder zu zerlegen, und diese entweder einzeln oder in Abhängigkeit eines jeweils anderen Feldes zu sortieren. So etwas beherrscht »Ex-sort« aus der 64'er, Ausgabe 11, 1984. Eine Sortierung des mehrdimensionalen Feldes aus Bild 2, mit den Methoden, die in unserem Kurs vorgestellt wurden, könnte nur nach dem Gesichtspunkt der computerinternen Ordnung (Bild 1) geschehen und würde Ihnen ein Chaos, wie Sie es in Bild 3 sehen können, hinterlassen.

DIM A$ (4,4,4)
A$(1,1,1)
A$(1,1,2)
A$(1,1,3)
A$(1,1,4)
A$(1,2,1)
A$(1,2,2)
A$(1,2,3)
A$(1,2,4)
A$(1,3,1)
…
A$(1,4,4)
A$(2,1,1)
A$(2,1,3)
A$(2,1,4)
A$(2,2,1)
…
A$ (2,4,4)
A$ (4,4,4)
Bild 1. So sind dreidimensionale Felder im Computer angeordnet
DIM A$ (4,4,4)
1. Eintrag:    A$(1,1,1):  Name
               A$(1,1,2):  Adresse
               A$(1,1,3):  Telefonnummer
               A$(1,1,4):  Kundennummer
2. Eintrag:    A$(2,1,1):  Name
               A$(2,1,2):  Adresse
…
4. Eintrag     A$(4,1,1):  Name
…
               A$ (4,4,4): Bestellung 128
Bild 2. So werden Feldelemente gerne vom Benutzer angeordnet, um einen einfachen Zugriff zu erreichen
DIM A$ (4,4,4)
A$(1,1,1)  Adresse 3
A$(1,1,2)  Adresse 1
A$(1,1,3)  Name 4
A$(1,1,4)  Bestellung 128
A$(1,2,1)  Adresse 2
A$(1,2,2)  Telefonnummer 3
…
Bild 3. Würde man die Kartei von Bild 2 nach dem computerinternen Standard der Feldanlage sortieren, so könnte zum Beispiel folgendes passieren:

Vermeiden Sie also prinzipiell die Anwendung mehrdimensionaler Felder, wenn Sie Sortierungen vornehmen wollen. Jedes mehrdimensionale Feld läßt sich nämlich auch durch entsprechende eindimensionale Felder ersetzen.

Die Anwendungen der Sortierprogramme

Unter vielen Anfragen zum Sortierkurs erreichten uns auch einige, die sich mit der Anwendung der Sortieralgorithmen selbst befaßten. Hier war oft unklar, wie die gezeigten Programme denn nun angewendet werden können. Nun, dieses Problem kann sehr einfach gelöst werden.

Vielleicht ist Ihnen aufgefallen, daß alle abgedruckten Sortieralgorithmen die Zeilennummern 10000 bis höchstens 19999 besaßen. Diese Zeilennummern waren so gehalten, daß man die eingetippten Sortieralgorithmen sofort mit dem Hauptprogramm, das einige Male mit abgedruckt wurde, testen konnte. Dieses Hauptprogramm hatte nämlich bei den Zeilennummern 10000 bis 19999 keine Programmzeile und so mußte das Sortierprogramm lediglich dort eingefügt werden.

Wollen Sie nun einen Sortieralgorithmus verwenden, weil er Ihnen zusagt, so müssen Sie einfach das Hauptprogramm weglassen und sich die Variablen ansehen, unter denen das Feld steht. Bei den Sortieralgorithmen war das zu sortierende Feld stets unter A$ und die Größe des A$-Feldes unter A gespeichert. Verwenden Sie andere Variablennamen, so müssen diese nur im Sortierprogramm entsprechend angepaßt werden, und schon läuft die ganze Sache. Vorsicht auch bei Variablen, die das Sortierprogramm verwendet und die unter Umständen mit Variablen in Ihrem Programm »kollidieren«. Die Sortieralgorithmen sind ja in der Regel sehr kurz, so daß Änderungen schnell gemacht sind.

Und immer wieder Quicksort

Noch eine Bemerkung zu Quicksort in Maschinensprache, das ebenfalls in Ausgabe 12/85 abgedruckt wurde. Es wurde damals schon erwähnt, daß es bei diesem Programm unbedingt notwendig ist, die zu sortierenden Daten in einem Stringarray (zum Beispiel A$,V$, oder ähnliche) abzulegen und dieses Feld als erstes im Basic-Programm zu dimensionieren. Wird das nicht gemacht, so kann es passieren, daß Quicksort-M die Variablenorganisation des Computers durcheinanderbringt, wobei ein »Aussteigen« des Computers die Folge ist. Wollen Sie das Quicksort-Programm als eigenes Maschinenprogramm stehen lassen, so müssen Sie es jeweils vor (!) dem Basic-Programm laden und danach »NEW« eintippen, um die Basic-Zeiger im Computer wieder herzustellen.

Natürlich ist kein Programm absolut perfekt, und so finden sich immer wieder Leser, die ihre Ansprüche ein wenig höher stecken. Die Ergebnisse zeigen sich dann in der Regel in einer stark verbesserten Version von abgedruckten Programmen oder in Neuentwicklungen von Problemlösungen.

So haben wir auch in diesem Artikel ein Bonbon für Sie vorbereitet. Es handelt sich, wie sollte es auch anders sein, um ein neues Quicksort in Maschinensprache, das uns Kurt Sörensen aus Hamburg zugesandt hat (Listing 2 und 3). Dieses Quicksort ist noch einmal mehr als viermal so schnell als unser Quicksort-M. Durch seine hohe Geschwindigkeit dürfte es wohl eines der schnellsten Sortierprogramme sein, die es für einen 6502-Mikroprozessor gibt. Zusätzlich zu diesen Vorteilen kommt noch dazu, daß das neue Quicksort-M um einiges kürzer ist als sein Vorgänger und selbst bei sehr komplizierten Datenfeldern keinen Stack-Überlauf mehr verursacht.

10   -;--------------- QUICKSORT.ASS ---------------
11   -;
900  -; ------------------------ VARIABLEN IN DER ZERO PAGE
901  -;
902  -.BA   50 000             ; START ADRESSE
903  -.EQ XADR=10              ; ADR.  A$(X) IN (10,11)
904  -.EQ YADR=12              ; ADR.  A$(Y) IN (12,13)
905  -.EQ VADR=14              ; ADR.  A$(V) IN (14,15)
906  -.EQ XDES=16              ; DESCR. A$(X) IN (16,17,18)
907  -.EQ YDES=19              ; DESCR. A$(Y) IN (19,20,21)
908  -.EQ VDES=22              ; DESCR. A$(V) IN (22,23,24)
909  -.EQ LG = 25              ; LINKE GRENZE IN (25,26)
910  -.EQ RG = 27              ; RECHTE GRENZE IN (27,28)
911  -.EQ VERL=29              ; VERGLEICHS LAENGEREADY.
912  -.EQ STIN=252             ; STACK EINGANGSWERT
913  -.EQ STMI=253             ; STACK MINIMUM
914  -.EQ STUG=254             ; STACK UNTERGRENZE
915  -;
1000 -; ------------------------ BASIC-DATEN RETTEN
1100 -;STACK-POINTER ------
1110 -          TSX
1120 -          STX STIN
1125 -          STX STMI
1130 -          TXA            ; STACK -
1140 -          SEC            ; UNTERGRENZE
1150 -          SBC #82        ; BERECHNEN
1160 -          BCS SPR
1170 -          RTS            ; ABBRUCH
1180 -SPR       ADC #2         ; 3 BYTE
1190 -          STA STUG       ; UEBER 0
1195 -;
1200 -;ZERO-PAGE ---------
1210 -          LDX #19
1220 -ZPWEG     LDA 10,X
1230 -          PHA
1240 -          DEX
1250 -          BPL ZPWEG
1260 -          TSX
1270 -          STX STIN
2000 -; ------------------------ ANFANGS - BEDINGUNGEN
2100 -; Z = 0 ----------
2110 -SORT      LDA #0
2120 -          PHA
2130 -          PHA
2200 -; LG = 1 ----------
2210 -          CLC
2220 -          LDA 47         ; FELDANFANG
2230 -          ADC #10        ; IN (47,48)
2240 -          STA LG         ;  + 10 BYTE
2250 -          LDA 48         ;  VORSPANN
2260 -          ADC #0         ;  ERGIBT
2270 -          STA LG+1       ; ADR A$(1)
2300 -; RG = A ----------
2310 -          CLC            ; FELDLAENGE
2320 -          LDY #2         ; STEHT  IM
2330 -          LDA (47),Y     ; VORSPANN
2340 -          ADC 47         ;   PLUS
2350 -          TAX            ; FELDANFANG
2360 -          INY
2370 -          LDA (47),Y
2380 -          ADC 48
2390 -          TAY
2400 -          SEC
2410 -          TXA            ;   MINUS
2420 -          SBC #3         ;   3 BYTE
2430 -          STA RG         ; FUER LETZTEN
2440 -          PHA            ; DESCRIPTOR
2450 -          TYA            ;  ERGIBT
2460 -          SBC #0         ; ADR A$(A)
2470 -          STA RG+1
2480 -          PHA
2490 -          BNE VSTRING
2500 -; Z = 1 ----------
2510 -;         BEDEUTET RG(1) AUF STACK LEGEN
2520 -;         SIEHE ZEILE 2440 UND 2480
2530 -BRUECKE4  BNE SORT
2540 -;
3000 -;------------------------ VERGLEICHSSTRING BERECHNEN
3100 -;X=LG:Y=RG ----------
3110 -VSTRING   LDX #3
3120 -LADXY     LDA LG,X
3130 -          STA XADR,X     ;   LADE -
3140 -          DEX            ;  SCHLEIFE
3150 -          BPL LADXY
3200 -;V = X + Y ----------
3210 -          CLC
3220 -          LDA XADR
3230 -          ADC YADR
3240 -          TAX
3250 -          LDA XADR+1
3260 -          ADC YADR+1
3300 -;V = INT(V/2) ----------
3310 -          LSR            ; HIGH BYTE
3320 -          STA VADR+1     ; RECHTS SHIFT
3330 -          TXA            ; LOW BYTE
3340 -          ROR            ; ROTATION
3350 -          BCC SPR1       ; RECHTS
3360 -          SBC #1         ; INT -
3370 -          BCS SPR1       ; MODULO
3380 -          DEC VADR+1     ;   3
3390 -SPR1      STA VADR
3400 -;V$ = A$(V) ----------
3410 -          LDY #0         ; DESCRIPTOR
3420 -          LDA (VADR),Y   ;   A$(V)
3430 -          STA VDES       ;  IN DER
3440 -          INY            ; ZERO PAGE
3450 -          LDA (VADR),Y   ; SPEICHERN
3460 -          STA VDES+1
3470 -          INY
3480 -          LDA (VADR),Y
3490 -          STA VDES+2
3495 -;
4000 -; ------------------------ X - VERGLEICHSSCHLEIFE
4100 -;X$ = A$(X) ----------
4110 -VERGLX    LDY #0         ; DESCRIPTOR
4120 -          LDA (XADR),Y   ;   A$(X)
4130 -          STA XDES       ;  IN DER
4140 -          INY            ; ZERO PAGE
4150 -          LDA (XADR),Y   ; SPEICHERN
4160 -          STA XDES+1
4170 -          INY
4180 -          LDA (XADR),Y
4190 -          STA XDES+2
4200 -;VERGLEICHS-LAENGE ----------
4210 -          LDX #0         ; X$ KUERZER:
4220 -          LDA XDES       ;  XREG=0
4230 -          CMP VDES       ;  VERL=LEN(X$)
4240 -          BCC SPR2       ; V$ KUERZER:
4250 -          INX            ;  XREG=1
4260 -          LDA VDES       ;  VERL=LEN(V$)
4270 -SPR2      STA VERL
4300 -;X$ &lt;?> V$ ----------
4310 -          LDY #0         ; HAUPTSCHLEIFE
4320 -VERGLX1   LDA (XDES+1),Y ; -------------
4330 -          CMP (VDES+1),Y ; BYTE UM BYTE
4340 -          BNE VERGLX2    ; VERGLEICHEN
4350 -          INY
4360 -          CPY VERL       ; VERGL.LAENGE
4370 -          BCC VERGLX1    ;   PRUEFEN
4380 -          CPX #1
4390 -VERGLX2   BCS VERGLY
4400 -;X = X + 1 ----------
4410 -          CLC
4420 -          LDA XADR       ; LOW-BYTE
4430 -          ADC #3         ;   + 3
4440 -          STA XADR       ; ZEIGT AUF
4450 -          BCC VERGLX     ; NAECHSTEN
4460 -          INC XADR+1     ; DESCRIPTOR
4470 -          BCS VERGLX
4480 -;SPRUNG --------------
4490 -BRUECKE1  BCC VSTRING
4491 -BRUECKE5  BNE BRUECKE4
4495 -;
5000 -; ------------------------ Y - VERGLEICHSSCHLEIFE
5100 -;Y$ = A$(Y) ----------
5110 -VERGLY    LDY #0         ; DESCRIPTOR
5120 -          LDA (YADR),Y   ;   A$(Y)
5130 -          STA YDES       ;  IN DER
5140 -          INY            ; ZERO PAGE
5150 -          LDA (YADR),Y   ; SPEICHERN
5160 -          STA YDES+1
5170 -          INY
5180 -          LDA (YADR),Y
5190 -          STA YDES+2
5200 -;VERGLEICHS-LAENGE ----------
5210 -          LDX #0         ; V$ KUERZER:
5220 -          LDA VDES       ;  XREG=0
5230 -          CMP YDES       ;  VERL=LEN(V$)
5240 -          BCC SPR3       ; Y$ KUERZER :
5250 -          INX            ;  XREG=1
5260 -          LDA YDES       ;  VERL=LEN(Y$)
5270 -SPR3      STA VERL
5300 -;Y$ &lt;?> V$ ----------
5310 -          LDY #0         ; HAUPTSCHLEIFE
5320 -VERGLY1   LDA (VDES+1),Y ; -------------
5330 -          CMP (YDES+1),Y ; BYTE UM BYTE
5340 -          BNE VERGLY2    ; VERGLEICHEN
5350 -          INY
5360 -          CPY VERL       ; VERGL.LAENGE
5370 -          BCC VERGLY1    ;   PRUEFEN
5380 -          CPX #1
5390 -VERGLY2   BCS TAUSCH
5400 -;Y = Y - 1 ----------
5410 -          SEC
5420 -          LDA YADR       ; LOW-BYTE
5430 -          SBC #3         ;   - 3
5440 -          STA YADR       ; ZEIGT AUF
5450 -          BCS VERGLY     ; VORHERIGEN
5460 -          DEC YADR+1     ; DESCRIPTOR
5470 -          BCC VERGLY
5480 -;SPRUNG --------------
5490 -BRUECKE2  BCS VERGLX
5491 -BRUECKE3  BCC BRUECKE1
5492 -BRUECKE6  BNE BRUECKE5
5495 -;
6000 -; ------------------------ STRINGS VERTAUSCHEN
6100 -;IF X>=Y  ----------
6110 -TAUSCH    LDA YADR+1     ; HIGH
6120 -          CMP XADR+1     ; BYTES
6130 -          BCC ZSTUFEN    ; X>Y
6140 -          BNE SWAP       ; X&lt;Y
6150 -          LDA XADR       ; LOW
6160 -          CMP YADR       ; BYTES
6170 -          BCS ZSTUFEN    ; X>=Y
6200 -;SWAP X$,Y$ ----------
6210 -SWAP      LDX #2
6220 -          LDY #2
6230 -SWAP1     LDA XDES,X     ; X-DESCRIPTOR
6240 -          STA (YADR),Y   ;  NACH A$(Y)
6250 -          LDA YDES,X     ; Y-DESCRIPTOR
6260 -          STA (XADR),Y   ;  NACH A$(X)
6270 -          DEX
6280 -          DEY
6290 -          BPL SWAP1
6300 -;X = X + 1 ----------
6310 -          CLC
6320 -          LDA XADR       ; SIEHE
6330 -          ADC #3         ; ZEILE
6340 -          STA XADR       ; 4400
6350 -          BCC SPR4
6360 -          INC XADR+1
6400 -;Y = Y - 1 ----------
6410 -SPR4      SEC
6420 -          LDA YADR       ; SIEHE
6430 -          SBC #3         ; ZEILE
6440 -          STA YADR       ; 5400
6450 -          BCS SPR5
6460 -          DEC YADR+1
6500 -;IF X &lt;= Y ----------
6510 -SPR5      LDA YADR+1
6520 -          CMP XADR+1
6530 -          BCC ZSTUFEN    ; X>Y
6540 -          BNE BRUECKE2   ; X&lt;Y
6550 -          LDA YADR
6560 -          CMP XADR
6570 -          BCS BRUECKE2   ; X&lt;=Y
6580 -          BCC ZSTUFEN    ; X>Y
6600 -; SPRUNG --------------
6610 -BRUECKE7  BNE BRUECKE6
7000 -;------------------------ STUFEN-VERZWEIGUNG
7100 -;Z=Z+1:RG=Y ----------
7110 -ZPLUS     LDA RG         ; Z = Z + 1
7120 -          PHA            ; BEDEUTET
7130 -          LDA RG+1       ; RG AUF STACK
7140 -          PHA            ; LEGEN
7150 -          LDA YADR
7160 -          STA RG         ;   RG
7170 -          LDA YADR+1     ;    =
7180 -          STA RG+1       ;    Y
7185 -          CLC            ; NEUEN V$
7190 -          BCC BRUECKE3   ;BERECHNEN
7200 -;LG = LG + 1 ----------
7210 -ZGLEICH   CLC
7220 -          LDA LG
7230 -          ADC #3         ; SIEHE
7240 -          STA LG         ; ZEILE
7250 -          BCC SPR6       ; 4400
7260 -          INY
7270 -SPR6      STY LG+1
7300 -;IF LG &lt; RG ----------
7310 -          CPY RG+1
7320 -          BCC BRUECKE3   ; LG&lt;RG
7330 -          BNE ZMINUS     ; LG>RG
7340 -          CMP RG
7350 -          BCC BRUECKE3   ; LG&lt;RG
7360 -          BCS ZMINUS     ; LG>=RG
7400 -;IF LG &lt; RG ----------
7410 -ZSTUFEN   LDA LG
7420 -          LDY LG+1
7430 -          CPY YADR+1
7440 -          BCC STACK      ; LG&lt;RG
7450 -          BNE ZGLEICH    ; LG>RG
7460 -          CMP YADR
7470 -          BCC STACK      ; LG&lt;RG
7480 -          BCS ZGLEICH    ; LG>=RG
7500 -;STACK PRUEFEN -------
7510 -STACK     TSX
7520 -          CPX STMI       ; STACKMINIMUM
7530 -          BCS ZPLUS      ; PRUEFEN
7540 -          STX STMI
7550 -          CPX STUG       ; STACK-UG
7560 -          BCS ZPLUS      ; PRUEFEN
7570 -          LDX STIN       ; RUECKSPRUNG
7580 -          TXS            ; ZUM
7585 -          BNE BRUECKE7   ; ANFANG
7600 -;Z = Z - 1 ----------
7610 -ZMINUS    PLA            ; Z = Z - 1
7620 -          STA RG+1       ; BEDEUTET
7630 -          PLA            ; RG VOM STACK
7640 -          STA RG         ; HOLEN
7650 -          LDX RG+1
7660 -          CPX #0         ; RG HIGHBYTE
7670 -          BNE ZGLEICH    ;    > 0
7680 -;                        ;    = 0
8000 -; ----------------------- BASIC-DATEN SPEICHERN
8100 -;STACK-POINTER -----
8110 -AUS       LDX STIN
8120 -          TXS
8200 -;ZERO-PAGE ---------
8210 -          LDX #0
8220 -ZPRUECK   PLA
8230 -          STA 10,X
8240 -          INX
8250 -          CPX #20
8260 -          BCC ZPRUECK
8270 -          RTS
Listing 2. Das Assembler-Listing der neuen Version von Quicksort in Maschinensprache. Die Sortierung beginnt mit »SYS 50000«.
PROGRAMM : QUICKSORT.COD  C350 C4F6
-----------------------------------
C350 : BA 86 FC 86 FD 8A 38 E9   46
C358 : 52 B0 01 60 69 02 85 FE   09
C360 : A2 13 B5 0A 48 CA 10 FA   4C
C368 : BA 86 FC A9 00 48 48 18   6D
C370 : A5 2F 69 0A 85 19 A5 30   61
C378 : 69 00 85 1A 18 A0 02 B1   78
C380 : 2F 65 2F AA C8 B1 2F 65   25
C388 : 30 A8 38 8A E9 03 85 1B   6F
C390 : 48 98 E9 00 85 1C 48 D0   9B
C398 : 02 D0 D0 A2 03 B5 19 95   F8
C3A0 : 0A CA 10 F9 18 A5 0A 65   F4
C3A8 : 0C AA A5 0B 65 0D 4A 85   C7
C3B0 : 0F 8A 6A 90 06 E9 01 B0   C6
C3B8 : 02 C6 0F 85 0E A0 00 B1   DB
C3C0 : 0E 85 16 C8 B1 0E 85 17   FF
C3C8 : C8 B1 0E 85 18 A0 00 B1   87
C3D0 : 0A 85 10 C8 B1 0A 85 11   5E
C3D8 : C8 B1 0A 85 12 A2 00 A5   2E
C3E0 : 10 C5 16 90 03 E8 A5 16   A5
C3E8 : 85 1D A0 00 B1 11 D1 17   3D
C3F0 : D0 07 C8 C4 1D 90 F5 E0   FE
C3F8 : 01 B0 11 18 A5 0A 69 03   EF
C400 : 85 0A 90 C9 E6 0B B0 C5   FD
C408 : 90 91 D0 8D A0 00 B1 0C   2F
C410 : 85 13 C8 B1 0C 85 14 C8   56
C418 : B1 0C 85 15 A2 00 A5 16   C0
C420 : C5 13 90 03 E8 A5 13 85   06
C428 : 1D A0 00 B1 17 D1 14 D0   BE
C430 : 07 C8 C4 1D 90 F5 E0 01   AE
C438 : B0 13 38 A5 0C E9 03 85   5C
C440 : 0C B0 C9 C6 0D 90 C5 B0   BD
C448 : 84 90 BD D0 BD A5 0D C5   66
C450 : 0B 90 69 D0 06 A5 0A C5   59
C458 : 0C B0 61 A2 02 A0 02 B5   02
C460 : 10 91 0C B5 13 91 0A CA   6E
C468 : 88 10 F4 18 A5 0A 69 03   8F
C470 : 85 0A 90 02 E6 0B 38 A5   52
C478 : 0C E9 03 85 0C B0 02 C6   C6
C480 : 0D A5 0D C5 0B 90 35 D0   08
C488 : BE A5 0C C5 0A B0 B8 90   FF
C490 : 2B D0 B8 A5 1B 48 A5 1C   C9
C498 : 48 A5 0C 85 1B A5 0D 85   85
C4A0 : 1C 18 90 A5 18 A5 19 69   87
C4A8 : 03 85 19 90 01 C8 84 1A   63
C4B0 : C4 1C 90 95 D0 26 C5 1B   E5
C4B8 : 90 8F B0 20 A5 19 A4 1A   2A
C4C0 : C4 0D 90 08 D0 DE C5 0C   63
C4C8 : 90 02 B0 D8 BA E4 FD B0   CD
C4D0 : C2 86 FD E4 FE B0 BC A6   A7
C4D8 : FC 9A D0 B5 68 85 1C 68   00
C4E0 : 85 1B A6 1C E0 00 D0 BC   EB
C4E8 : A6 FC 9A A2 00 68 95 0A   B5
C4F0 : E8 E0 14 90 F8 60         FD
Listing 3. Das MSE-Listing für Quicksort in Maschinensprache

Auch bei dem neuen Quicksort in Maschinensprache ist das zu sortierende Stringfeld stets das, das als erstes in einem Programm dimensioniert wurde. Das Starten des Sortiervorgangs erfolgt dabei mit »SYS 50000«.

Das neue Quicksort-M dürfte wohl den allermeisten Anwendungen genügen. Wenn es jedoch jemanden gibt, der immer noch nicht das optimale Sortierprogramm gefunden hat, dem bleibt dann bloß noch die Eigeninitiative (vielleicht können wir irgendwann einmal das perfekte Sortierprogramm als »Listing des Monats« begrüßen?).

(K. Sörensen/ks)
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →