Clojure的sort和sort-by都承诺“保证稳定性:相等的元素不会被重新排序。”
ClojureScript中sort
和sort-by
当前实现来自
9ee4dbf63d3968b70f29708aa03aace98cdcb624 作者:Stuart Halloway <[email protected]> 作者日期:Thu Jul 14 12:18:34 2011 -0500
`
(defn sort
"返回coll中项的排序序列。Comp可以是
布尔值比较函数,或值比较器。
Comp默认为compare。
([coll]
(sort compare coll))
([comp coll]
(if (seq coll)
(let [a (to-array coll)]
;; matching Clojure's stable sort, though docs don't promise it
(garray/stableSort a (fn->comparator comp))
(seq a))
())))
(defn sort-by
"返回coll中项的排序序列,排序
顺序由(keyfn item)确定。Comp可以是
布尔值比较函数,或值比较器。
Comp默认为compare。
([keyfn coll]
(sort-by keyfn compare coll))
([keyfn comp coll]
(sort (fn [x y] ((fn->comparator comp) (keyfn x) (keyfn y))) coll)))
`
由于此实现似乎已经连续8年调用了google的stableSort,或许文档字符串可以进行修改以反映这一点。
参考资料,google closure数组文档:(链接:https://google.github.io/closure-library/api/goog.array.html)
请注意,stableSort的文档字符串实际上没有提到稳定性,但排序函数中包含“此排序无法保证稳定性。”