Cls

Dim ZS(60), ZS$(60) ' System Stack Space
Dim KW$(60)         ' Global Array for Keywords

n = ReadKW
t1 = TimeInSecs

Print "Sorting..."

QSortKW 0, n - 1, 0, n -1
t2 = TimeInSecs

For i = 0 to n - 1
    Print KW$(i),
Next

Print
Print t2 - t1; "Seconds."

End    

Sub QSortKW(l1, r1, i, j)
    Dim n, pivot$
    n = (l1 + r1) \ 2
    pivot$ = KW$(n)
    Repeat
        Do While pivot$ > KW$(i): i = i + 1: Loop
        Do While pivot$ < KW$(j): j = j - 1: Loop
        If i <=j then
            SwapKW i, j
            i = i + 1: j = j - 1
        End If
    Until i > j
    If l1 < j Then
        QSortKW l1, j, l1, j
    End If
    If i < r1 Then
        QSortKW i, r1, i, r1
    End If
End Sub


Sub SwapKW(a, b)
    Dim tmp$
    tmp$ = KW$(a)
    KW$(a) = KW$(b)
    KW$(b) = tmp$
End Sub

Function TimeInSecs
    DIM TI, TI$

    TI$ = TIME$
    TI = VAL(MID$(TI$,1,2))*3600
    TI = TI + VAL(MID$(TI$,4,2))*60
    TI = TI + VAL(MID$(TI$,7,2))
    RETURN TI
End Function

Function ReadKW
    Dim I, K$
    Restore Keywords
    i = 0
    Repeat
        Read K$
        KW$(i) = K$
        i = i + 1
    Until K$ =  "***"
    Return i - 1
End Function

Label Keywords
Data "LABEL","WHILE","WEND","REPEAT","UNTIL","DO","LOOP","EXIT","GOSUB"
Data "RETURN","GOTO","ON","IF","THEN","ELSE","ELSEIF","ENDIF","FOR"
Data "NEXT","REM","DATA","RESTORE","CALL","SUB","ENDSUB","FUNC","FUNCTION"
Data "ENDFUNC","END","SELECT","CASE","PRINT","INPUT","DIM","DATA","TO"
Data "STEP","SOUND","POKE","CLS","PRINT@","MENU","LINE","PSET","PRESET"
Data "POKE","LINEINPUT","BEEP","OUT","INP","SYSCALL","CLOSE","RESUME"
Data "OPEN","AS","DEF","FN","ON","***"

