home *** CD-ROM | disk | FTP | other *** search
- REM * ---------------------------------------------------- *
- REM * SORTDEMO.BAS *
- REM * Anschauliches Sortieren am Bildschirm *
- REM * (c) 1989 Gerd Kraus & TOOLBOX *
- REM * ---------------------------------------------------- *
- REM * Compiler: Quick Basic 4.0 *
- REM * Die Änderungen für Turbo Basic sind kommentiert *
- REM * ---------------------------------------------------- *
-
- REM -------- keine Deklarationen in Turbo Basic! ----------
- DECLARE SUB CursorTasten (Ch$)
- DECLARE SUB HolZeichen (Taste$)
- DECLARE SUB Auswahl (von%, Bis%, Eingabe$)
- DECLARE SUB Titel (Ext$)
- DECLARE SUB Originalwerte ()
- DECLARE SUB Fensterloeschen ()
- DECLARE SUB Markieren (Zahl%, Ort%)
- DECLARE SUB SchreibZeile (Start%, Ziel%, Anzahl%)
- DECLARE SUB ZeilenZaehler (LineNr%, Steps%, von%, nach%)
- DECLARE SUB ENDE (Nummer%, Anzahl%)
- DECLARE SUB Vorspann (Title$, LineNr%, Steps%)
- DECLARE SUB Zwischenschritt ()
- DECLARE SUB RippleSort ()
- DECLARE SUB BubbleSort ()
- DECLARE SUB ShellSort ()
- DECLARE SUB InsertionSort ()
- DECLARE SUB HeapSort ()
- DECLARE SUB HEAP (ii%, jj%, nn%, mm%, HHilf%)
- DECLARE SUB QuickSort ()
- DECLARE SUB HolArray (Max%, Feld%())
- DECLARE SUB Menue ()
-
- REM ------------- allgemeine Variablen -------------------
-
- Title$ = "Sortier-Demo"
- CO$ = "(c) 1989 G. Kraus & TOOLBOX"
- Version$ = "V.1.0"
- ENT$ = CHR$(13)
- DoppelAn$ = CHR$(27) + CHR$(69) ' Doppeldruck an
- DoppelAus$ = CHR$(27) + CHR$(70) ' Doppeldruck aus
- DruckerAn% = 0
-
- ON KEY(3) GOSUB Drucker: KEY(3) ON
-
- REM ------ ARRAYs für das Menü und zum Sortieren ----------
-
- MaxMenue% = 7
- DIM Menu$(MaxMenue%)
- MaxSort% = 15 'max. 16 für gewählten Bildschirmaufbau
- DIM Sort%(1 TO MaxSort%) '(1: MaxSort%) Turbo Basic
-
- CALL Menue 'das ist das Hauptprogramm !!!
- END
-
- REM ------ Ein "konventionelles" Unterprogramm ------------
- Drucker:
- REM DruckerAn% ist keine globale Variable,
- REM wird deshalb im Hauptmenue immer auf "0" gesetzt !
-
- LOCATE 25, 18: PRINT " ";
- DruckerAn% = NOT DruckerAn%
- LOCATE 25, 18: COLOR 2, 4:
- IF DruckerAn% THEN
- PRINT " an ";
- ELSE
- COLOR 4, 2: PRINT " aus ";
- END IF
- COLOR 7, 0
-
- RETURN
-
-
- REM -------------------------------------------------------
- SUB Auswahl (von%, Bis%, Eingabe$)
- REM liest Zeichen aus einer bestimmten Menge ein
-
- REM 'LOCAL OK% in Turbo Basic
-
- DO
- Eingabe$ = ""
- CALL HolZeichen(Eingabe$)
- Eingabe$ = UCASE$(Eingabe$)
- OK% = 1
- IF VAL(Eingabe$) < von% OR VAL(Eingabe$) > Bis% THEN
- BEEP
- OK% = 0
- END IF
- LOOP UNTIL OK% = 1
-
- END SUB
-
- REM -------------------------------------------------------
- SUB BubbleSort
- REM das 1. Element wird mit der gesamten Liste verglichen
-
- SHARED MaxSort%, Sort%()
- REM LOCAL Zeile%, Schritte%, i%, j% -- in Turbo Basic
-
- CALL Vorspann("Bubblesort", Zeile%, Schritte%)
- CALL ZeilenZaehler(Zeile%, Schritte%, 0, 0)
- FOR i% = 1 TO MaxSort% - 1
- FOR j% = i% + 1 TO MaxSort%
- IF Sort%(i%) > Sort%(j%) THEN
- SWAP Sort%(i%), Sort%(j%)
- END IF
- CALL ZeilenZaehler(Zeile%, Schritte%, i%, j%)
- NEXT j%
- NEXT i%
- CALL ENDE(Zeile%, Schritte%)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB CursorTasten (Ch$)
- REM Abfrage der Scan-Codes wird im Programm nicht gebraucht
-
- IF ASC(Ch$) = 0 THEN
- SELECT CASE ASC(MID$(Ch$, 2, 1))
- CASE 60: ' F1 .. usw.
- CASE ELSE
- Ch$ = CHR$(0)
- END SELECT
- END IF
-
- END SUB
-
- REM -------------------------------------------------------
- SUB ENDE (Nummer%, Anzahl%)
- SHARED ENT$, MaxSort%, Sort%()
-
- BEEP
- IF Nummer% >= 19 THEN CALL Fensterloeschen: Nummer% = 3
- PRINT
- PRINT MaxSort%; " Zahlen in"; Anzahl% - 1;
- PRINT "Schritten sortiert"
- PRINT
- FOR j% = 1 TO MaxSort%
- PRINT USING "####"; Sort%(j%);
- NEXT j%
- IF Nummer% + 3 > 21 THEN CALL Fensterloeschen
- PRINT : PRINT
- PRINT TAB(30); : COLOR 0, 7
- PRINT " Weiter mit "; CHR$(17); CHR$(217); CHR$(32);
- COLOR 7, 0
- DO
- CALL HolZeichen(Taste$)
- LOOP UNTIL Taste$ = ENT$
-
- END SUB
-
- REM -------------------------------------------------------
- SUB Fensterloeschen
- REM löscht die sortierten Werte
- REM LOCAL k% für Turbo Basic
-
- CALL HolZeichen("")
- LOCATE 3, 1
- FOR k% = 3 TO 23: PRINT SPACE$(80); : NEXT
- LOCATE 3, 1
-
- END SUB
-
- REM -------------------------------------------------------
- SUB HEAP (ii%, jj%, nn%, mm%, HHilf%)
- SHARED MaxSort%, Sort%(), Zeile%, Schritte%
- REM LOCAL dummy%, temp% für Turbo Basic
-
- ii% = nn%
- dummy% = 2 * ii%
- DO WHILE dummy% <= mm%
- jj% = 2 * ii%
- IF jj% < mm% THEN
- IF Sort%(jj% + 1) > Sort%(jj%) THEN jj% = jj% + 1
- END IF
- IF HHilf% < Sort%(jj%) THEN
- Sort%(ii%) = Sort%(jj%)
- CALL ZeilenZaehler(Zeile%, Schritte%, jj%, ii%)
- temp% = ii%
- ii% = jj%
- jj% = 2 * ii%
- dummy% = jj%
- ELSE
- dummy% = mm% + 1
- END IF
- LOOP
- Sort%(ii%) = HHilf%
- CALL ZeilenZaehler(Zeile%, Schritte%, temp%, ii%)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB HeapSort
- REM Ausgabe grün - rot = Zwischenstand
- REM Ausgabe rot - grün = Endstand
- SHARED MaxSort%, Sort%(), Zeile%, Schritte% ' global !
- REM LOCAL i%, j%, m%, n%, Hilf% für Turbo Basic
-
- CALL Vorspann("Heap Sort", Zeile%, Schritte%)
- CALL Zwischenschritt
- CALL ZeilenZaehler(Zeile%, Schritte%, 0, 0)
-
- ' Stufe 1 : das größte Element wird gesucht und ..
- ' .. an die erste Stelle gesetzt
-
- m% = MaxSort%
- FOR n% = INT(MaxSort% / 2) TO 1 STEP -1
- Hilf% = Sort%(n%)
- CALL HEAP(i%, j%, n%, m%, Hilf%)
- NEXT n%
-
- ' Stufe 2 : das größte Element wird jeweils entfernt ..
- ' .. und das nunmehr größte Element an die ..
- ' .. 1. Stelle (des Restfeldes !!) gesetzt !
-
- n% = 1
- FOR m% = MaxSort% - 1 TO 1 STEP -1
- Hilf% = Sort%(m% + 1)
- Sort%(m% + 1) = Sort%(1)
- CALL HEAP(i%, j%, n%, m%, Hilf%)
- NEXT m%
- CALL ENDE(Zeile%, Schritte%)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB HolArray (Max%, Feld%(1))
- REM das ARRAY wird mit den Zahlen 15..1 gefüllt,
- REM lässt sich einfach auf eigene Zahlenfolgen umstellen
- REM interessanter Test : Feld bereits sortiert
- REM LOCAL i% Turbo Basic
-
- FOR i% = Max% TO 1 STEP -1
- Feld%(Max% + 1 - i%) = i%
- NEXT
-
- ' FOR i% = 1 TO Max% : Feld% (i%) = i% : NEXT
-
- END SUB
-
- REM -------------------------------------------------------
- SUB HolZeichen (Taste$)
- REM liest ein Zeichen von der Tastatur einschl. Scan-Codes
-
- DO
- Taste$ = INKEY$
- LOOP UNTIL Taste$ <> ""
- CALL CursorTasten(Taste$)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB InsertionSort
- REM Ausgabe grün - rot = Zwischenstand
- REM Ausgabe rot - grün = Endstand
- SHARED MaxSort%, Sort%()
- REM LOCAL Zeile%, Schritte%, i%, j%, dummy%, Hilf% (Turbo)
-
- CALL Vorspann("Insertion Sort", Zeile%, Schritte%)
- CALL Zwischenschritt
- CALL ZeilenZaehler(Zeile%, Schritte%, 0, 0)
- FOR j% = 1 TO MaxSort% - 1
- Hilf% = Sort%(j% + 1)
- FOR i% = j% TO 1 STEP -1
- IF Hilf% > Sort%(i%) THEN EXIT FOR
- Sort%(i% + 1) = Sort%(i%): dummy% = i% + 1
- CALL ZeilenZaehler(Zeile%, Schritte%, i% + 1, i%)
- NEXT i%
- Sort%(i% + 1) = Hilf%
- CALL ZeilenZaehler(Zeile%, Schritte%, i% + 1, j% + 1)
- NEXT j%
- CALL ENDE(Zeile%, Schritte%)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB Markieren (Zahl%, Ort%)
- SHARED DruckerAn%, DoppelAn$, DoppelAus$
-
- IF Ort% = 2 THEN COLOR 2, 4 ELSE COLOR 4, 2
- PRINT USING "####"; Zahl%;
- COLOR 7, 0
- IF DruckerAn% THEN
- LPRINT DoppelAn$;
- LPRINT USING "####"; Zahl%;
- LPRINT DoppelAus$;
- END IF
-
- END SUB
-
- REM -------------------------------------------------------
- SUB Menue
- SHARED MaxMenue%, Menu$(), MaxSort%, Sort%()
- REM LOCAL Schleife%, Laenge%, Zeile%, Wahl$ (Turbo Basic)
-
- Menu$(1) = "Ripplesort "
- Menu$(2) = "Bubblesort "
- Menu$(3) = "Shell-Sort "
- Menu$(4) = "Insertion Sort "
- Menu$(5) = "Heap Sort "
- Menu$(6) = "Quicksort "
- Menu$(7) = "ENDE "
-
- ' ausprobieren : Binary Sort, Maximum-Sort ...
-
- DO
- CALL Titel("")
- CALL HolArray(MaxSort%, Sort%())
- Zeile% = 3
- FOR Schleife% = 1 TO MaxMenue%
- LOCATE Zeile% + Schleife% * 2, 14
- Laenge% = 50 - LEN(Menu$(Schleife%))
- PRINT Menu$(Schleife%) + STRING$(Laenge%, ".");
- PRINT Schleife%
- NEXT
- LOCATE 25, 5: PRINT "F3 = Drucker ";
- COLOR 4, 2:
- IF DruckerAn% THEN PRINT " an "; ELSE PRINT " aus ";
- COLOR 7, 0
- CALL Auswahl(1, MaxMenue%, Wahl$)
- SELECT CASE Wahl$
- CASE "1": CALL RippleSort
- CASE "2": CALL BubbleSort
- CASE "3": CALL ShellSort
- CASE "4": CALL InsertionSort
- CASE "5": CALL HeapSort
- CASE "6": CALL QuickSort
- CASE "7":
- END SELECT
- LOOP UNTIL Wahl$ = "7"
-
- END SUB
-
- REM -------------------------------------------------------
- SUB Originalwerte
- REM "Statuszeile"
- SHARED MaxSort%, Sort%()
- REM LOCAL j% (Turbo Basic)
-
- LOCATE 25, 1
- COLOR 1, 4: PRINT SPACE$(80);
- LOCATE 25, 7: PRINT "Start :";
- FOR j% = 1 TO MaxSort%
- PRINT USING "####"; Sort%(j%);
- NEXT
- COLOR 7, 0
-
- END SUB
-
- REM -------------------------------------------------------
- SUB QuickSort
- SHARED MaxSort%, Sort%()
- REM LOCAL Zeile%, Schritte%, i%, j%, m%, k%, n%
- REM LOCAL Links%, Rechts%, temp% () für Turbo Basic
-
- CALL Vorspann("Quicksort", Zeile%, Schritte%)
- CALL ZeilenZaehler(Zeile%, Schritte%, 0, 0)
- m% = 2 * MaxSort%
- DIM temp%(m%, 0 TO 1) '(m%, 0 : 1) -> Turbo!
- k% = 1: temp%(1, 0) = 1: temp%(1, 1) = MaxSort%
-
- DO
- Links% = temp%(k%, 0)
- Rechts% = temp%(k%, 1): k% = k% - 1
- DO
- i% = Links%: j% = Rechts%
- n% = Sort%(INT(Links% + Rechts%) / 2)
- DO
- WHILE Sort%(i%) < n%
- i% = i% + 1
- WEND
- WHILE Sort%(j%) > n%
- j% = j% - 1
- WEND
- IF i% <= j% THEN
- SWAP Sort%(i%), Sort%(j%)
- CALL ZeilenZaehler(Zeile%, Schritte%, i%, j%)
- i% = i% + 1
- j% = j% - 1
- END IF
- LOOP UNTIL i% > j%
- IF i% < Rechts% THEN
- k% = k% + 1
- temp%(k%, 0) = i%
- temp%(k%, 1) = Rechts%
- END IF
- Rechts% = j%
- LOOP UNTIL Links% >= Rechts%
- LOOP UNTIL k% <= 0
- CALL ENDE(Zeile%, Schritte%)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB RippleSort
- REM jeweils 2 aufeinanderfolgende Elemente vergleichen
- SHARED MaxSort%, Sort%()
- REM LOCAL Zeile%, Schritte%, i%, Vertauscht% -> Turbo!
-
- CALL Vorspann("Ripplesort", Zeile%, Schritte%)
- CALL ZeilenZaehler(Zeile%, Schritte%, 0, 0)
- DO
- Vertauscht% = 0
- FOR i% = 1 TO MaxSort% - 1
- IF Sort%(i%) > Sort%(i% + 1) THEN
- SWAP Sort%(i%), Sort%(i% + 1)
- Vertauscht% = 1
- END IF
- CALL ZeilenZaehler(Zeile%, Schritte%, i%, i% + 1)
- NEXT i%
- LOOP UNTIL Vertauscht% = 0
- CALL ENDE(Zeile%, Schritte%)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB SchreibZeile (Start%, Ziel%, Anzahl%)
- SHARED MaxSort%, Sort%(), DruckerAn%
- REM LOCAL i% -> Turbo Basic
-
- PRINT TAB(7);
- COLOR 6, 1: PRINT USING "#### : "; Anzahl%;
- FOR i% = 1 TO MaxSort%
- IF Anzahl% / 2 = INT(Anzahl% / 2) THEN
- COLOR 0, 3
- ELSE
- COLOR 0, 7
- END IF
- IF i% = Ziel% THEN
- CALL Markieren(Sort%(i%), 1)
- ELSEIF i% = Start% THEN
- CALL Markieren(Sort%(i%), 2)
- ELSE
- PRINT USING "####"; Sort%(i%);
- IF DruckerAn% THEN LPRINT USING "####"; Sort%(i%);
- END IF
- NEXT i%
- PRINT : IF DruckerAn% THEN LPRINT
- COLOR 7, 0
- END SUB
-
- REM -------------------------------------------------------
- SUB ShellSort
- REM die Liste wird in 2 gleichgrosse Teillisten zerlegt
- REM erweitert auf Shell-Metzner-Sort
- SHARED MaxSort%, Sort%()
- REM LOCAL Zeile%, Schritte%, i%, j%, k%, n%
- REM LOCAL dummy%, Mitte% -> Turbo Basic
-
- CALL Vorspann("Shell-Sort", Zeile%, Schritte%)
- CALL ZeilenZaehler(Zeile%, Schritte%, 0, 0)
- Mitte% = MaxSort%
- Mitte% = INT(Mitte% / 2)
- DO
- j% = 1: k% = MaxSort% - Mitte%
- DO
- i% = j%
- DO
- n% = i% + Mitte%
- IF Sort%(i%) > Sort%(n%) THEN
- SWAP Sort%(i%), Sort%(n%)
- dummy% = i%
- i% = i% - Mitte%
- ELSE
- dummy% = i%: i% = 0
- END IF
- CALL ZeilenZaehler(Zeile%, Schritte%, dummy%, n%)
- LOOP UNTIL i% < 1
- j% = j% + 1
- LOOP UNTIL j% > k%
- Mitte% = INT(Mitte% / 2)
- LOOP UNTIL Mitte% = 0
- CALL ENDE(Zeile%, Schritte%)
-
- END SUB
-
- REM -------------------------------------------------------
- SUB Titel (Ext$)
- REM Titelbild
- SHARED Title$, CO$, Version$
- REM LOCAL Spalte%, Help$ -> Turbo Basic
-
- CLS
- COLOR 1, 4: PRINT SPACE$(80)
- LOCATE 1, 5: PRINT Version$
- Help$ = Title$ + Ext$
- Spalte% = INT(80 - LEN(Help$)) / 2
- LOCATE 1, Spalte%: PRINT Help$
- LOCATE 1, 63: PRINT CO$
- COLOR 7, 0
-
- END SUB
-
- REM -------------------------------------------------------
- SUB Vorspann (Title$, LineNr%, Steps%)
-
- LineNr% = 2: Steps% = 0
- CALL Titel(" : " + Title$)
- CALL Originalwerte
- LOCATE 3, 1
-
- END SUB
-
- REM -------------------------------------------------------
- SUB ZeilenZaehler (LineNr%, Steps%, von%, nach%)
-
- CALL SchreibZeile(von%, nach%, Steps%)
- Steps% = Steps% + 1
- LineNr% = LineNr% + 1
- IF LineNr% = 23 THEN
- CALL Fensterloeschen
- LineNr% = 2
- END IF
-
- END SUB
-
- REM -------------------------------------------------------
- SUB Zwischenschritt
- REM "Zwischenergebnisse" werden in umgekehrter Reihenfolge
- REM farbig markiert
-
- LOCATE 24, 45: PRINT "Zwischenstand = Farbfolge : ";
- COLOR 4, 2: PRINT " "; : COLOR 2, 4: PRINT " ";
- COLOR 7, 0: LOCATE 3, 1
-
- END SUB
-
- REM -------------------------------------------------------
- REM Ende von SORTDEMO.BAS