fix: qsort ran into an infinite loop when encountering duplicate values.
This commit is contained in:
parent
d8145565cd
commit
64ae51ba71
2 changed files with 36 additions and 7 deletions
|
@ -90,25 +90,50 @@ namespace Jellyfin.Plugin.SmartPlaylist.Lisp {
|
||||||
(lambda
|
(lambda
|
||||||
(list0)
|
(list0)
|
||||||
(car list0)))
|
(car list0)))
|
||||||
|
;(split
|
||||||
|
; (lambda
|
||||||
|
; (list0 pivot fc h0 h1)
|
||||||
|
; (cond
|
||||||
|
; ((null list0) (list list0 pivot fc h0 h1))
|
||||||
|
; ((fc (car list0) pivot) (split (cdr list0) pivot fc h0 (cons (car list0) h1)))
|
||||||
|
; (t (split (cdr list0) pivot fc (cons (car list0) h0) h1)))))
|
||||||
(split
|
(split
|
||||||
(lambda
|
(lambda
|
||||||
(list0 pivot fc h0 h1)
|
(list0 pivot fc h0 h1 heq)
|
||||||
(cond
|
(cond
|
||||||
((null list0) (list list0 pivot fc h0 h1))
|
((null list0) (list list0 pivot fc h0 h1 heq))
|
||||||
((fc (car list0) pivot) (split (cdr list0) pivot fc h0 (cons (car list0) h1)))
|
((and
|
||||||
(t (split (cdr list0) pivot fc (cons (car list0) h0) h1)))))
|
(fc (car list0) pivot)
|
||||||
|
(fc pivot (car list0))) (split (cdr list0) pivot fc h0 h1 (cons (car list0) heq)))
|
||||||
|
((fc (car list0) pivot) (split (cdr list0) pivot fc h0 (cons (car list0) h1) heq))
|
||||||
|
((fc pivot (car list0)) (split (cdr list0) pivot fc (cons (car list0) h0) h1 heq))
|
||||||
|
((= (car list0) pivot) (split (cdr list0) pivot fc h0 h1 (cons (car list0) heq)))
|
||||||
|
(t (split (cdr list0) pivot fc h0 h1 heq)))))
|
||||||
|
;(sort
|
||||||
|
; (lambda
|
||||||
|
; (fc list0)
|
||||||
|
; (cond
|
||||||
|
; ((null list0) nil)
|
||||||
|
; ((null (cdr list0)) list0)
|
||||||
|
; (t
|
||||||
|
; (let*
|
||||||
|
; (halves (split list0 (getpivot list0) fc nil nil))
|
||||||
|
; (h0 (car (cdr (cdr (cdr halves)))))
|
||||||
|
; (h1 (car (cdr (cdr (cdr (cdr halves))))))
|
||||||
|
; (append (sort fc h0) (sort fc h1)))))))
|
||||||
(sort
|
(sort
|
||||||
(lambda
|
(lambda
|
||||||
(fc list0)
|
(fc list0)
|
||||||
(cond
|
(begin t (cond
|
||||||
((null list0) nil)
|
((null list0) nil)
|
||||||
((null (cdr list0)) list0)
|
((null (cdr list0)) list0)
|
||||||
(t
|
(t
|
||||||
(let*
|
(let*
|
||||||
(halves (split list0 (getpivot list0) fc nil nil))
|
(halves (split list0 (getpivot list0) fc nil nil nil))
|
||||||
(h0 (car (cdr (cdr (cdr halves)))))
|
(h0 (car (cdr (cdr (cdr halves)))))
|
||||||
(h1 (car (cdr (cdr (cdr (cdr halves))))))
|
(h1 (car (cdr (cdr (cdr (cdr halves))))))
|
||||||
(append (sort fc h0) (sort fc h1)))))))
|
(heq (car (cdr (cdr (cdr (cdr (cdr halves)))))))
|
||||||
|
(append (append (sort fc h0) heq) (sort fc h1))))))))
|
||||||
(sort fc list00)))
|
(sort fc list00)))
|
||||||
"""
|
"""
|
||||||
);
|
);
|
||||||
|
|
|
@ -267,6 +267,10 @@ namespace Tests
|
||||||
//Assert.Equal("", e.eval("(shuf (list 0 1 2 3 4 5 6))").ToString());
|
//Assert.Equal("", e.eval("(shuf (list 0 1 2 3 4 5 6))").ToString());
|
||||||
Assert.Equal("(1 2 3 4 5 6 7)", e.eval("(qsort (lambda (a b) (> a b)) '(5 4 7 3 2 6 1))").ToString());
|
Assert.Equal("(1 2 3 4 5 6 7)", e.eval("(qsort (lambda (a b) (> a b)) '(5 4 7 3 2 6 1))").ToString());
|
||||||
Assert.Equal("(1 2 3 4 5 6 7)", e.eval("(qsort > (list 5 4 7 3 2 6 1))").ToString());
|
Assert.Equal("(1 2 3 4 5 6 7)", e.eval("(qsort > (list 5 4 7 3 2 6 1))").ToString());
|
||||||
|
Assert.Equal("(0 1 2 4 5 5)", e.eval("(qsort > '(2 4 1 5 5 0))").ToString());
|
||||||
|
Assert.Equal("(5 5 4 2 1 0)", e.eval("(qsort < '(2 4 1 5 5 0))").ToString());
|
||||||
|
Assert.Equal("(5 5 4 2 1 0)", e.eval("(qsort <= '(2 4 1 5 5 0))").ToString());
|
||||||
|
Assert.Equal("(0 1 2 4 5 5)", e.eval("(qsort >= '(2 4 1 5 5 0))").ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue