diff options
| author | mryouse | 2022-07-15 01:24:12 +0000 |
|---|---|---|
| committer | mryouse | 2022-07-15 01:24:12 +0000 |
| commit | 4a7b4e7a54be36cf4d7d1f725822d72846fae0af (patch) | |
| tree | e9f3f0395525d15aba223e25268f2d01bd0b72a7 | |
| parent | b3bb6d85245ac5d2b9b450965301e99604d49eb3 (diff) | |
initial commit of sort.neb
| -rw-r--r-- | libs/sort.neb | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/libs/sort.neb b/libs/sort.neb new file mode 100644 index 0000000..9fe20b7 --- /dev/null +++ b/libs/sort.neb @@ -0,0 +1,79 @@ +; sort.neb +; an exploration of sorting algorithms in neb + +(func .prepend (lst item) + (list-reverse (append (list-reverse lst) item))) + +(func bubble (lst) + (def orig lst) + (def working (list)) + (def swp #false) + (for-count (list-length lst) + (branch + ((eq? 0 (list-length (rest orig))) + (redef working (append working (first orig)))) + ((> (first orig) (first (rest orig))) + (block + (redef swp #true) + (redef working (append working (first (rest orig)))) + (redef orig (.prepend (rest (rest orig)) (first orig))))) + (#true + (block + (redef working (append working (first orig))) + (redef orig (rest orig)))))) + + (print (->string working)) + (if swp + (bubble working) + working)) + +(func extend (lst1 lst2) + (def ret lst1) + (for-each lst2 + (redef ret (append ret _item_))) + ret) + +(func insert (lst item) + (extend + (append (take-while lst (< _item_ item)) item) + (drop-while lst (< _item_ item)))) + +(func insertion (lst) + (def ret (list)) + (for-each lst + (redef ret (insert ret _item_)) + (print (->string ret))) + ret) + +(func merge (lst) + (print (concat "sorting: " (->string lst))) + (if (eq? 1 (list-length lst)) + lst + (block + (def half (floor (/ (list-length lst) 2))) + (def left (merge (slice lst 1 half))) + (def right (merge (slice lst (+ 1 half)))) + (.merge left right)))) + +(func .merge (lst1 lst2) + (print (concat "lst1: " (->string lst1))) + (print (concat "lst2: " (->string lst2))) + (def res (list)) + (def w1 lst1) + (def w2 lst2) + (while (and (not (empty? w1)) (not (empty? w2))) + (if (< (first w1) (first w2)) + (block + (redef res (append res (first w1))) + (redef w1 (rest w1))) + (block + (redef res (append res (first w2))) + (redef w2 (rest w2))))) + (while (not (empty? w1)) + (redef res (append res (first w1))) + (redef w1 (rest w1))) + + (while (not (empty? w2)) + (redef res (append res (first w2))) + (redef w2 (rest w2))) + res) |
