(def print (x) () (sys 1 x))
(def printc (c) () (sys 2 c))
(def nl () () (sys 2 10))
(def space () () (sys 2 32))
(def not (b) () (if b 0 1))
(def != (a b) () (not (= a b)))
(def <= (a b) () (not (> a b)))
(def >= (a b) () (not (< a b)))
(def nop () () 0)

(def swap (a i j) (t)
  (do
  (set t (vec a i))
  (setv a i (vec a j))
  (setv a j t)))

(def partition (a p r) (x i j flag)
  (do
  (set x (vec a p))
  (set i (- p 1))
  (set j (+ r 1))
  (set flag 1)
  (while flag
    (do
    (set j (- j 1))
    (while (> (vec a j) x)
      (set j (- j 1)))
    (set i (+ i 1))
    (while (< (vec a i) x)
      (set i (+ i 1)))
    (if (< i j) (swap a i j) (set flag 0))))
  j ))

(def quicksort (a p r) (q)
  (if (< p r)
    (do
      (set q (partition a p r))
      (quicksort a p q)
      (quicksort a (+ q 1) r))
    0))

(def inita (a s) (i)
  (do
  (set i 0)
  (while (< i s)
    (do
    (setv a i (- s i))
    (set i (+ i 1))))))

(def show (a s) (i)
  (do
  (set i 0)
  (while (< i s)
    (do
    (print (vec a i))
    (space)
    (set i (+ i 1))))
  (nl)))

(def main () (a)
  (do
  (set a (new 20))
  (inita a 20)
  (show a 20)
  (quicksort a 0 19)
  (show a 20)))
