我正在查看问题How to merge two sorted arrays之一,并尝试使用Java 8流转换解决方案。但是仍然没有成功。实际上,没有什么我可以在这里分享的。

必须有一种在函数式编程中使用索引处理此类循环的方法。在不改变时间复杂度的情况下,如何用其他语言(例如Scala,Clojure)完成此操作?也许那时我可以尝试用Java复制它。

编辑:提到问题的代码是最有效的,我不想对此做出妥协。

最佳答案

实际上,到处都有相同的方法:您重复两个集合,将最小集合头添加到结果中,然后重复其余集合,直到一个(或两个)集合为空。在Clojure中:

(defn merge-sorted [pred coll1 coll2]
  (loop [coll1 coll1 coll2 coll2 res []]
    (cond (or (empty? coll1) (empty? coll2)) (concat res coll1 coll2)
          (pred (first coll1) (first coll2)) (recur (rest coll1)
                                                    coll2
                                                    (conj res (first coll1)))
          :else (recur coll1 (rest coll2) (conj res (first coll2))))))

user> (merge-sorted < [1 3 5 6 7 8 9 40 50] [1 2 5 10 100])
(1 1 2 3 5 5 6 7 8 9 10 40 50 100)

10-05 19:04