DECLARE SUB sort (x1!, x2!)
DECLARE SUB check ()
DECLARE SUB di (r1!, r2!, c!)
DECLARE SUB disp ()
DIM SHARED siz
siz = 15000
DIM SHARED arr(1 TO siz)
DIM SHARED mark(1 TO siz)
DIM SHARED bck(1 TO siz)
DIM SHARED dbg
WIDTH 80, 50

dbg = 1
CLS
FOR i = 1 TO 1000
LOCATE 5, 40
PRINT i
RANDOMIZE i
siz = 45

FOR a = 1 TO siz
  arr(a) = INT(RND * 100)
  bck(a) = arr(a)
NEXT a
11

sort 1, siz
disp


fail = 0
FOR i2 = 1 TO siz - 1
  IF arr(i2) > arr(i2 + 1) THEN
    PRINT "wrong!"
    a$ = INPUT$(1)
    fail = 1
    GOTO 10
  END IF
NEXT i2
10

IF fail = 1 THEN
  FOR i2 = 1 TO siz
    arr(i2) = bck(i2)
  NEXT i2
  dbg = 1
  GOTO 11
END IF

NEXT i

SUB di (r1, r2, c)

mark(r1) = c
mark(r2) = c
disp
mark(r1) = 0
mark(r2) = 0


END SUB

SUB disp
FOR i = 1 TO siz
  LOCATE i, 1
  COLOR 15, mark(i)
  PRINT arr(i), "    ", i
NEXT i

IF dbg = 1 THEN a$ = INPUT$(1)
'SOUND 0, .05
END SUB

SUB sort (x1, x2)
min = 99999
max = -99999
FOR i = x1 TO x2
  IF arr(i) > max THEN max = arr(i)
  IF arr(i) < min THEN min = arr(i)
NEXT i
sv = (max + min) / 2
LOCATE 1, 50
PRINT sv
'disp
di x1, x2, 4
IF x1 >= x2 THEN GOTO 3

IF x1 + 1 = x2 THEN
  IF arr(x1) > arr(x2) THEN SWAP arr(x1), arr(x2)
  GOTO 3
END IF

xl1 = x1
xl2 = x2


1
di xl1, xl2, 1
IF arr(xl1) > sv THEN
2
  IF arr(xl2) < sv THEN
    SWAP arr(xl1), arr(xl2)
    xl1 = xl1 + 1
    xl2 = xl2 - 1
  ELSE
    xl2 = xl2 - 1
    di xl1, xl2, 1
    IF xl1 = xl2 THEN GOTO 4
    GOTO 2
  END IF
ELSE
  xl1 = xl1 + 1
END IF

IF xl1 < xl2 THEN GOTO 1
'IF arr(xl1) < sv THEN xl1 = xl1 + 1
'IF arr(xl1) < sv THEN xl1 = xl1 + 1
4
mark(xl1) = 14
disp
mark(xl1) = 0

IF xl1 = x2 THEN
  sort x1, xl1 - 1
ELSE
  IF arr(xl1) > sv THEN
    sort x1, xl1 - 1
    sort xl1, x2
  ELSE
    sort x1, xl1
    sort xl1 + 1, x2
  END IF
END IF
3
END SUB

