; Quick-sort, 快速排序
;======================================================================================
(quick-sort (vector 12 23 34 20 11 30) <) ; #(11 12 20 23 30 34)
(quick-sort (vector "one" "two" "three" "too" "four") string<?) ; #("four" "one" "three" "too" "two")
;======================================================================================
(define (quick-sort v less?)
(define (swap i j)
(let ((s (vector-ref v i))
(k (vector-ref v j)))
(if (less? k s)
(begin
(vector-set! v i k)
(vector-set! v j s)))))
(define (partition i j)
(let t ((p (+ i 1)) (q (- j 1)))
(if (>= p q)
(begin (swap i p) p)
(if (less? (vector-ref v p) (vector-ref v i))
(t (+ p 1) q)
(if (not (less? (vector-ref v q) (vector-ref v i)))
(t p (- q 1))
(begin
(swap p q)
(t (+ p 1) (- q 1))))))))
(let sort ((start 0) (end (vector-length v)))
(if (< start (- end 1))
(let ((p (partition start end)))
(sort start p)
(sort p end))))
v)
;========================================================================================
(define (quick-sort2 v less?)
(define (swap i j)
(if (< i j)
(let ((r (vector-ref v i)))
(vector-set! v i (vector-ref v j))
(vector-set! v j r))))
(let sort ((start 0) (end (vector-length v)))
(if (< start (- end 1))
(let t ((p (+ start 1)) (q (+ start 1)))
(if (< q end)
(if (less? (vector-ref v q) (vector-ref v start))
(begin
(swap p q)
(t (+ p 1) (+ q 1)))
(t p (+ q 1)))
(begin
(swap start (- p 1))
(sort start p)
(sort p end))))))
v)
分治法(Scheme) -- 快速排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.