1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-28 11:09:54 +00:00

Merge pull request #545 from felixr/master

Revert my buggy hybrid sort
This commit is contained in:
Calvin Rose 2021-01-03 16:39:23 -06:00 committed by GitHub
commit 81f62b246c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -774,45 +774,34 @@
a a
(if (not= (> b a) (> b c)) b c))) (if (not= (> b a) (> b c)) b c)))
(defn- insertion-sort [a lo hi by] (defn sort-help [a lo hi by]
(for i (+ lo 1) (+ hi 1) (when (< lo hi)
(def temp (in a i)) (def pivot
(var j (- i 1)) (median-of-three (in a hi) (in a lo)
(while (and (>= j lo) (by temp (in a j))) (in a (math/floor (/ (+ lo hi) 2)))))
(set (a (+ j 1)) (in a j)) (var left lo)
(-- j)) (var right hi)
(while true
(set (a (+ j 1)) temp)) (while (by (in a left) pivot) (++ left))
(while (by pivot (in a right)) (-- right))
(when (<= left right)
(def tmp (in a left))
(set (a left) (in a right))
(set (a right) tmp)
(++ left)
(-- right))
(if (>= left right) (break)))
(sort-help a lo right by)
(sort-help a left hi by))
a) a)
(defn sort (defn sort
"Sort an array in-place. Uses quick-sort and is not a stable sort." "Sort an array in-place. Uses quick-sort and is not a stable sort."
[a &opt by] [a &opt by]
(default by <) (sort-help a 0 (- (length a) 1) (or by <)))
(def stack @[[0 (- (length a) 1)]])
(while (not (empty? stack))
(def [lo hi] (array/pop stack))
(when (< lo hi)
(when (< (- hi lo) 32) (insertion-sort a lo hi by) (break))
(def pivot (median-of-three (in a hi) (in a lo) (in a (math/floor (/ (+ lo hi) 2)))))
(var left lo)
(var right hi)
(while true
(while (by (in a left) pivot) (++ left))
(while (by pivot (in a right)) (-- right))
(when (<= left right)
(def tmp (in a left))
(set (a left) (in a right))
(set (a right) tmp)
(++ left)
(-- right))
(if (>= left right) (break)))
(array/push stack [lo right])
(array/push stack [left hi])))
a)
(undef median-of-three) (undef median-of-three)
(undef insertion-sort) (undef sort-help)
(defn sort-by (defn sort-by
`Returns a new sorted array that compares elements by invoking `Returns a new sorted array that compares elements by invoking