mirror of
https://github.com/janet-lang/janet
synced 2024-11-28 19:19:53 +00:00
Merge commit '0ea77cabfb30afc15433581f5888171c1f65aafd'
This commit is contained in:
commit
20bcd95279
@ -791,38 +791,49 @@
|
||||
###
|
||||
|
||||
(defn- median-of-three [a b c]
|
||||
(if (not= (> a b) (> a c))
|
||||
(if (not= (> a b) (> a c))
|
||||
a
|
||||
(if (not= (> b a) (> b c)) b c)))
|
||||
|
||||
(defn sort-help [a lo hi by]
|
||||
(when (< lo hi)
|
||||
(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)))
|
||||
(sort-help a lo right by)
|
||||
(sort-help a left hi by))
|
||||
(defn- insertion-sort [a lo hi by]
|
||||
(for i (+ lo 1) (+ hi 1)
|
||||
(def temp (in a i))
|
||||
(var j (- i 1))
|
||||
(while (and (>= j lo) (by temp (in a j)))
|
||||
(set (a (+ j 1)) (in a j))
|
||||
(-- j))
|
||||
|
||||
(set (a (+ j 1)) temp))
|
||||
a)
|
||||
|
||||
(defn sort
|
||||
"Sort an array in-place. Uses quick-sort and is not a stable sort."
|
||||
[a &opt by]
|
||||
(sort-help a 0 (- (length a) 1) (or by <)))
|
||||
(default 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 sort-help)
|
||||
(undef insertion-sort)
|
||||
|
||||
(defn sort-by
|
||||
`Returns a new sorted array that compares elements by invoking
|
||||
|
@ -268,14 +268,13 @@ int32_t janet_hash(Janet x) {
|
||||
if (isnan(num) || isinf(num) || num == 0) {
|
||||
hash = 0;
|
||||
} else {
|
||||
int e = 0;
|
||||
double rest = frexp(num, &e);
|
||||
int64_t intrest = (int64_t)(rest * JANET_INTMAX_DOUBLE);
|
||||
uint32_t accum = (uint32_t)((intrest >> 22) ^ intrest);
|
||||
accum ^= 0x9e3779b9 + (accum << 3) + (accum >> 2);
|
||||
accum += (int32_t)(e);
|
||||
accum ^= 0x9e3779b9 + (accum << 3) + (accum >> 2);
|
||||
hash = (int32_t) accum;
|
||||
hash = (int32_t)num;
|
||||
hash = ((hash >> 16) ^ hash) * 0x45d9f3b;
|
||||
hash = ((hash >> 16) ^ hash) * 0x45d9f3b;
|
||||
hash = (hash >> 16) ^ hash;
|
||||
|
||||
uint32_t lo = (uint32_t)(janet_u64(x) & 0xFFFFFFFF);
|
||||
hash ^= lo + 0x9e3779b9 + (hash << 6) + (hash >> 2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user