Exsort — Sortieren mit Komfort
Mit Exsort werden sowohl numerische als auch alphanumerische Felder auf-oder und absteigend sehr schnell sortiert. Ein weiterer Clou: Ein zweites Feld kann abhängig vom ersten Feld mitsortiert werden.
Jeder Programmierer ärgert sich irgendwann einmal über das langsame Basic, das vor allem beim Suchen und Sortieren stört. Gute Sortierroutinen, in Assembler geschrieben, kann nicht jeder entwickeln. Viele Sort-Programme sind aber auch sehr einseitig: Entweder sortieren sie nur aufsteigend oder lediglich alphanumerische Felder. Exsort kann beides und noch mehr.
Vorteile:
- Zirka zehnmal so schnell wie die schnellste Basic-Version.
- Die Befehle können in jedem Basic-Programm angewendet werden.
- Unterprogramme in Basic, die oft nur ein bestimmtes Feld in einer Richtung sortieren können, entfallen.
- Die Erweiterung belegt keinen Basic-Speicher.
- Beim Sortieren von Strings kommt es nicht zu einem zeitraubenden Garbage-Collect, da die Descriptoren vertauscht werden.
- Ein zweites Feld, das Informationen über das erste Feld enthält, kann mitsortiert werden.
- Das zu sortierende Feld kann numerisch oder alphanumerisch sein.
Nachteile:
- Es kann nicht mit Exbasic oder Simons Basic zusammen genutzt werden.
- Es kann nicht compiliert werden.
Sortierbefehle
1. Befehl »so«
Syntax: so, (feldname), (anfangsindex), (endindex), (sortierungsrichtung)
Dieser Befehl sortiert ein beliebiges eindimensionales Feld innerhalb von zwei Grenzen mit einer vom Benutzer gewählten Sortierungsrichtung.
Beispiel 1:
Das Feld heißt ax$, alphanumerisch aufsteigend sortieren (von Index 100 bis Index 5000).
Befehl: so,ax$,100,5000,1 (1 = aufsteigend)
Beispiel 2:
Das Feld heißt qe%, numerisch absteigend sortieren (von Index 0 bis zu dem Index, der in der Variable »en« enthalten ist).
Befehl: so,qe%,0,en,0 (0 = absteigend)
Option: Manchmal ist es notwendig, daß Daten, die in einem zweiten Feld vorhanden sind, entsprechend dem ersten Feld sortiert werden.
Syntax: so,(feldname 1), (anfangsindex), (endindex), (sortierungsrichtung), (feldname2)
Beispiel: Das Feld fe$ soll alphanumerisch aufsteigend von Index 0 bis Index 10 sortiert werden. Die Daten in dem Realfeld »nr« sollen entsprechend dem ersten Feld sortiert werden.
Befehl: so,fe$,0,10,1,nr
2. Befehl: »se«
Syntax: se,(feldname),(anfangsindex),(endindex),(element)
Dieser Befehl durchsucht ein beliebiges eindimensionales Feld innerhalb von zwei Grenzen nach einem Element.
Beispiel: Es soll die Zahl - 12 in dem Feld rt% von Index 0 bis Index 100 gesucht werden.
Befehl: se,rt%,0,100, - 12
Wenn das Element gefunden wird, enthält die Variable »in« den jeweiligen Index. Wird das Element nicht gefunden, so enthält »in« den Wert -1.
Fehlermeldungen:
- type mismatch:
Sie versuchten, einen String in einem numerischen Feld zu suchen (oder umgekehrt). - wrong index:
Beim Suchen war der Anfangsindex größer als der Endindex. - bad subscript:
Index außerhalb des zulässigen Bereiches. - only one dimension array:
Sie können nur eindimensionale Felder durchsuchen oder sortieren. - array not found:
Das Feld war nicht durch einen DIM-Befehl dimensioniert worden. - wrong array name:
Geben Sie bitte nur die ersten beiden Buchstaben des Feldnamen ein (plus % oder $ wenn nötig). Es wird dann sicher funktionieren. - wrong sorting direction error:
Sie haben einen anderen Wert als 0 oder 1 als Sortierungsrichtung angegeben.
Zu den Programmen:
Listing 1
Das Programm »Exsort data« erstellt das Maschinenprogramm aus DATA-Zeilen und speichert es als »Exsort«-Absolutprogramm auf Diskette oder Kassette. Sie können es dann jederzeit durch LOAD »Exsort«, 8,1 absolutladen. Dabei geht ein Basic-Programm nicht verloren (siehe auch Listing 2, Demo-Programm).
Listing 2
Das Programm »Exsort demo« lädt das Absolutprogramm »Exsort« nach und startet es. Danach folgt eine Demonstration der beiden Befehle.
Um »Exsort« zu laden, muß Zeile 0 des Basic-Programms lauten:
0 if k = 0 then k = 1 : load"ex-sort",8,1 (für Diskette)
0 if k = 0 then k = 1 : load"ex-sort",1,1 (für Kassette)
In Zeile 1 muß stehen:
1 sys 49400
Da die Erweiterung nur einmal geladen und gestartet werden muß, kann sie bei späteren Starts des Programms übersprungen werden.
(Marcus Rickert/gk)0 ifk=0thenk=1:load"exsort?",8,1:rem laden von exsort
1 sys49400:rem starten von exsort
100 rem ***********************
110 rem *** exsort demo ***
120 rem ***********************
130 rem
140 rem ******************
150 rem * 1.befehl: "so" *
160 rem ******************
165 print"{clr}Erster Befehl: 'so'"
170 input"{down}Zahl der zu sortierenden Elemente";a
175 print"{down}Anfuellen des Feldes 'za' mit Zufalls- zahlen"
180 dimza(a)
190 rem *** das feld za wird mit zufallszahlen belegt ***
200 fors=1toa
210 :za(s)=rnd(1)*10000-5000
220 nexts
230 it=ti:rem zeit speichern
240 print"{down}Sortierbeginn"
250 rem
260 rem *** aufruf des befehls "so" ***
270 so,za,1,a,1
280 rem so = befehl
290 rem za = feldname
300 rem 1 = anfangsindex
310 rem a = endindex
320 rem 1 = sortierungsrichtung(aufsteigend)
330 rem
340 it=ti-it
350 print"{down}Sortierende"
355 fors=1to1000:nexts
360 rem *** ausgabe der sortierten elemente ***
370 fors=1toa
380 :prints,tab(6)za(s)
390 nexts
400 print"{down}Zeit:"it/60"sec"
410 print"{down}bitte Taste druecken"
420 gett$:ift$=""then420
430 rem
440 rem ******************
450 rem * 2.befehl: "se" *
460 rem ******************
470 rem
480 clr:dimfe$(10000)
485 print"{clr}Zweiter Befehl 'se'"
490 rem ** in 50 beliebige elemente **
500 rem ** des feldes fe$ wird das **
510 rem ** wort "hallo" geschrieben **
520 rem
525 print"{down}In 50 beliebige Elemente von fe$ wird 'hallo' geschrieben"
530 fors=1to50
540 :fe$(rnd(1)*10000)="hallo"
550 nexts
560 print"{down}In folgendem elementen steht 'hallo':"
570 rem
580 rem ** ausdrucken jedes indexes **
590 rem ** in dem "hallo" steht **
600 rem
610 in=-1:it=ti
620 rem ** aufruf des befehls "se" **
630 se,fe$,in+1,10000,"hallo"
640 rem se = befehl
650 rem fe$ = feldname
660 rem in+1 = anfangsindex
670 rem 10000 = endindex
680 rem "hallo" = element
690 rem ** bei rueckkehr aus "se" **
700 rem ** enthaelt "in" den index **
710 rem ** oder (wenn das element **
720 rem ** nicht gefunden wurde) **
730 rem ** den wert -1 **
740 ifin=-1orin=10000then760
750 printin,:goto630
760 print:print"{down}Zeit:"(ti-it)/60"sec"
770 print"{down}bitte Taste druecken"
780 gett$:ift$=""then780
790 rem
800 rem ****************************
810 rem * 1.befehl 'so' mit option *
820 rem ****************************
830 rem
835 print"{clr}Erster Befehl mit option"
840 datanull,zwei,vier,sechs,acht,zehn,eins,drei,fuenf,sieben,neun
850 data0,2,4,6,8,10,1,3,5,7,9
860 clr:dimnr(10),nr$(10)
870 rem ** einlesen in feld nr$ **
880 fors=0to10
890 :readx$:nr$(s)=x$
900 nexts
910 rem ** einlesen in feld nr **
920 fors=0to10
930 :readx:nr(s)=x
940 nexts
950 rem ** ausgabe feld vor sortierung **
960 print"{down}Index nr$ vorher nr * nr$ nachher nr"
970 fors=0to10
980 :prints;tab(6)nr$(s)tab(16)nr(s)
990 nexts
1000 rem ** aufruf des befehl "so" mit option **
1010 so,nr$,0,10,0,nr
1020 rem so = befehl
1030 rem nr$ = feldname 1
1040 rem 0 = anfangsindex
1050 rem 10 = endindex
1060 rem 0 = sortierungsrichutng(absteigend)
1070 rem nr = feldname 2
1080 rem
1090 print"{down}Sortieren von nr$ absteigend"
1095 print"{down}nr wird entsprechend mitsortiert"
1097 print"{down}bitte Taste druecken"
1098 gett$:ift$=""then1098
1100 rem ** ausgabe feld nach sortierung **
1110 print"{home}{down}{down}{down}";
1120 fors=0to10
1130 :printtab(22)nr$(s)tab(33)nr(s)
1140 nexts
1150 print"{down}{down}{down}{down}{down}{down}"
PROGRAMM : EXSORT. C0F8 C6AC ----------------------------------- C0F8 : A9 03 8D 08 03 A9 C1 8D 27 C100 : 09 03 60 A0 01 B1 7A C9 D2 C108 : 53 F0 03 4C E4 A7 C8 B1 30 C110 : 7A C9 45 D0 03 4C DA C5 64 C118 : C9 4F D0 EF 20 73 00 20 99 C120 : 73 00 20 73 00 20 FD AE 60 C128 : 20 EC C4 20 24 C3 4C 58 36 C130 : C1 20 FD AE 20 8A AD 20 A4 C138 : F7 B7 A5 14 8D 00 C0 A5 1E C140 : 15 8D 01 C0 20 FD AE 20 61 C148 : 8A AD 20 F7 B7 A5 14 8D C4 C150 : 02 C0 A5 15 8D 03 C0 60 73 C158 : 20 31 C1 20 FD AE 20 9E 98 C160 : B7 8E 04 C0 E0 02 90 07 E6 C168 : A2 78 A0 C5 4C FA C4 20 17 C170 : C7 C3 8E 06 C0 8C 07 C0 8B C178 : 8D 08 C0 A0 00 B1 7A F0 A7 C180 : 04 C9 3A D0 08 A9 00 8D FA C188 : 0B C0 4C A2 C1 20 FD AE CD C190 : 20 EC C4 20 24 C3 20 C7 CC C198 : C3 8E 09 C0 8C 0A C0 8D 34 C1A0 : 0B C0 A9 00 8D 05 C0 A0 BB C1A8 : 00 20 3C C5 A0 02 20 3C 93 C1B0 : C5 A9 00 8D F6 C0 8D F7 97 C1B8 : C0 A0 12 20 50 C5 90 03 CC C1C0 : 4C AE A7 A0 10 20 50 C5 30 C1C8 : A2 10 A0 12 20 2A C5 8E 64 C1D0 : 14 C0 8C 15 C0 A2 14 A0 BD C1D8 : F6 20 9A C4 F0 DB 30 D9 80 C1E0 : AD 10 C0 8D 0C C0 AD 11 17 C1E8 : C0 8D 0D C0 AD 12 C0 8D 54 C1F0 : 0E C0 AD 13 C0 8D 0F C0 62 C1F8 : 20 EF C3 A0 06 AE 08 C0 8C C200 : E8 8A A2 0C 20 01 C5 20 B9 C208 : 2F C4 F0 17 48 AD 04 C0 3C C210 : D0 06 68 10 0E 4C 1B C2 35 C218 : 68 30 08 A2 0C 20 E3 C4 CA C220 : 4C FB C1 A0 06 AE 08 C0 66 C228 : E8 8A A2 0E 20 01 C5 20 21 C230 : 2F C4 F0 17 48 AD 04 C0 64 C238 : D0 06 68 30 0E 4C 43 C2 01 C240 : 68 10 08 A2 0E 20 D1 C4 B9 C248 : 4C 23 C2 A2 0C A0 0E 20 69 C250 : 9A C4 F0 02 10 67 A0 06 94 C258 : AE 08 C0 E8 8A A2 0C 20 86 C260 : 01 C5 86 FB 84 FC A0 06 24 C268 : AE 08 C0 E8 8A A2 0E 20 9E C270 : 01 C5 86 FD 84 FE AC 08 B8 C278 : C0 20 69 C5 AD 0B C0 F0 73 C280 : 26 A0 09 AE 0B C0 E8 8A 7E C288 : A2 0C 20 01 C5 86 FB 84 E2 C290 : FC A0 09 AE 0B C0 E8 8A 64 C298 : A2 0E 20 01 C5 86 FD 84 FB C2A0 : FE AC 0B C0 20 69 C5 A2 79 C2A8 : 0C 20 E3 C4 A2 0E 20 D1 14 C2B0 : C4 A2 0E A0 0C 20 9A C4 13 C2B8 : 30 03 4C FB C1 A2 0E A0 A7 C2C0 : 10 20 2A C5 8E 14 C0 8C C9 C2C8 : 15 C0 A2 12 A0 0C 20 2A 67 C2D0 : C5 8E 16 C0 8C 17 C0 A2 44 C2D8 : 14 A0 16 20 9A C4 10 22 1A C2E0 : A2 0C A0 12 20 9A C4 10 FD C2E8 : 0A A0 0C 20 3C C5 A0 12 E2 C2F0 : 20 3C C5 AD 0E C0 8D 12 97 C2F8 : C0 AD 0F C0 8D 13 C0 4C 78 C300 : C8 C1 A2 10 A0 0E 20 9A 84 C308 : C4 10 0A A0 10 20 3C C5 E9 C310 : A0 0E 20 3C C5 AD 0C C0 C2 C318 : 8D 10 C0 AD 0D C0 8D 11 C2 C320 : C0 4C C8 C1 A9 04 8D 14 8A C328 : C0 A2 00 86 03 86 04 20 BF C330 : 73 00 F0 3F C9 3A F0 3B 70 C338 : C9 24 F0 14 C9 25 F0 18 8C C340 : C9 2C F0 2F 15 03 95 03 07 C348 : E0 02 F0 20 E8 4C 2F C3 9F C350 : A9 02 8D 14 C0 4C 63 C3 64 C358 : A9 01 8D 14 C0 A5 03 09 BF C360 : 80 85 03 A5 04 09 80 85 AE C368 : 04 4C 2F C3 A2 9E A0 C5 04 C370 : 4C FA C4 A5 2F 85 FB A5 79 C378 : 30 85 FC 4C A4 C3 A0 00 1E C380 : B1 FB C5 03 D0 0A C8 B1 E4 C388 : FB C5 04 D0 03 4C B7 C3 7A C390 : A0 02 18 A5 FB 71 FB AA 7D C398 : 08 C8 28 A5 FC 71 FB 85 19 C3A0 : FC 8A 85 FB A5 FB C5 31 76 C3A8 : D0 D4 A5 FC C5 32 D0 CE BA C3B0 : A2 8F A0 C5 4C FA C4 A0 EC C3B8 : 04 B1 FB C9 01 D0 01 60 28 C3C0 : A2 B9 A0 C5 4C FA C4 18 FF C3C8 : A0 06 B1 FB ED 02 C0 08 59 C3D0 : 88 B1 FB 28 ED 03 C0 B0 90 C3D8 : 07 A2 00 A9 12 4C 3B A4 1F C3E0 : 18 A5 FB 69 07 AA A5 FC 4D C3E8 : 69 00 A8 AD 14 C0 60 18 2A C3F0 : AD 10 C0 6D 12 C0 AA AD B0 C3F8 : 11 C0 6D 13 C0 4A 8D 15 E6 C400 : C0 8A 6A 8D 14 C0 AE 08 64 C408 : C0 E8 8A A0 06 A2 14 20 F9 C410 : 01 C5 86 28 84 29 AD 08 F3 C418 : C0 C9 04 D0 04 8A 4C A2 E3 C420 : BB AE 08 C0 8A A8 B1 28 51 C428 : 95 61 CA 88 10 F8 60 86 89 C430 : 28 84 29 AD 08 C0 C9 02 4C C438 : F0 09 C9 01 F0 41 8A 20 C3 C440 : 5B BC 60 A0 01 B1 28 85 6F C448 : 03 C8 B1 28 85 04 A0 00 1C C450 : 4C 62 C4 B1 03 D1 62 F0 5F C458 : 08 B0 03 A9 01 60 A9 FF 68 C460 : 60 C8 98 A0 00 D1 28 F0 70 C468 : 08 C5 61 F0 04 A8 4C 53 27 C470 : C4 B1 28 C5 61 F0 05 B0 E3 C478 : E5 4C 5B C4 A9 00 60 A5 5A C480 : 61 8D 15 C0 A5 62 8D 14 D1 C488 : C0 A0 00 B1 28 8D 17 C0 9B C490 : C8 B1 28 8D 16 C0 A2 14 07 C498 : A0 16 BD 00 C0 D9 00 C0 0F C4A0 : D0 0B BD 01 C0 D9 01 C0 E6 C4A8 : D0 03 4C 7C C4 BD 01 C0 5C C4B0 : 30 17 B9 01 C0 30 A4 38 8B C4B8 : BD 00 C0 F9 00 C0 BD 01 E4 C4C0 : C0 F9 01 C0 90 98 4C 5B 8B C4C8 : C4 B9 01 C0 10 90 4C B7 E7 C4D0 : C4 38 BD 00 C0 E9 01 9D BA C4D8 : 00 C0 BD 01 C0 E9 00 9D 5E C4E0 : 01 C0 60 FE 00 C0 D0 03 89 C4E8 : FE 01 C0 60 A5 7A 38 E9 86 C4F0 : 01 85 7A A5 7B E9 00 85 19 C4F8 : 7B 60 86 22 84 23 4C 47 AA C500 : A4 85 28 BD 00 C0 85 71 28 C508 : BD 01 C0 85 72 A9 00 85 A6 C510 : 29 98 48 20 57 B3 86 28 19 C518 : 84 29 68 A8 18 A5 28 79 A2 C520 : 00 C0 AA A5 29 79 01 C0 C3 C528 : A8 60 38 B9 00 C0 FD 00 44 C530 : C0 48 B9 01 C0 FD 01 C0 24 C538 : A8 68 AA 60 AE 05 C0 B9 54 C540 : 00 C0 9D 19 C0 B9 01 C0 8A C548 : 9D 88 C0 E8 8E 05 C0 60 4B C550 : AE 05 C0 CA 10 02 38 60 BD C558 : BD 19 C0 99 00 C0 BD 88 13 C560 : C0 99 01 C0 8E 05 C0 18 89 C568 : 60 B1 FB AA B1 FD 91 FB 3E C570 : 8A 91 FD 88 10 F3 60 FF 75 C578 : 57 52 4F 4E 47 20 53 4F F7 C580 : 52 54 49 4E 47 20 44 49 32 C588 : 52 45 43 54 49 4F CE 41 A5 C590 : 52 52 41 59 20 4E 4F 54 E1 C598 : 20 46 4F 55 4E C4 57 52 67 C5A0 : 4F 4E 47 20 41 52 52 41 5F C5A8 : 59 20 4E 41 4D C5 57 52 D2 C5B0 : 4F 4E 47 20 49 4E 44 45 9F C5B8 : D8 4F 4E 4C 59 20 4F 4E C5 C5C0 : 45 20 44 49 4D 45 4E 53 2E C5C8 : 49 4F 4E 20 41 52 52 41 C3 C5D0 : D9 00 FF 00 FF 00 FF 20 E9 C5D8 : FF 00 20 73 00 20 73 00 1D C5E0 : 20 73 00 20 FD AE 20 EC 6E C5E8 : C4 20 24 C3 20 31 C1 20 11 C5F0 : C7 C3 8E 06 C0 8C 07 C0 0B C5F8 : 8D 08 C0 20 FD AE 20 9E D0 C600 : AD A2 02 A0 00 20 9A C4 88 C608 : 10 07 A2 AE A0 C5 4C FA 7A C610 : C4 AD 08 C0 C9 02 F0 14 5E C618 : 20 8D AD AD 08 C0 C9 04 D6 C620 : F0 17 20 AA B1 85 61 84 CF C628 : 62 4C 39 C6 20 A3 B6 85 DC C630 : 61 A5 22 85 62 A5 23 85 88 C638 : 63 AE 08 C0 E8 8A A0 06 7E C640 : A2 00 20 01 C5 8E 09 C0 81 C648 : 8C 0A C0 AE 09 C0 AC 0A 3D C650 : C0 20 2F C4 F0 2A A2 00 70 C658 : A0 02 20 9A C4 F0 1A A2 D6 C660 : 00 20 E3 C4 38 AD 09 C0 98 C668 : 6D 08 C0 8D 09 C0 AD 0A 1C C670 : C0 69 00 8D 0A C0 4C 4B 05 C678 : C6 A9 FF A0 FF 4C 86 C6 31 C680 : AD 01 C0 AC 00 C0 20 91 1D C688 : B3 A9 00 85 0D 85 0E A9 49 C690 : 49 85 45 A9 4E 85 46 20 8D C698 : E7 B0 A6 47 A4 48 20 D4 21 C6A0 : BB 4C AE A7 FF 00 FF FF 22 C6A8 : C9 20 F0 0D 06