Sorting 内置'的时间复杂度;排序';在Clojure
我想知道Clojure编程语言提供的内置“sort”函数的复杂性(Big-O表示法),我在上搜索了它,但没有找到任何相关信息Sorting 内置'的时间复杂度;排序';在Clojure,sorting,clojure,big-o,Sorting,Clojure,Big O,我想知道Clojure编程语言提供的内置“sort”函数的复杂性(Big-O表示法),我在上搜索了它,但没有找到任何相关信息 提前感谢。查看源代码,您可以看到它只是委托给java.util.array.sort: (defn sort ([coll] (sort compare coll)) ([^java.util.Comparator comp coll] (if (seq coll) (let [a (to-array coll)] (. jav
提前感谢。查看源代码,您可以看到它只是委托给
java.util.array.sort
:
(defn sort
([coll]
(sort compare coll))
([^java.util.Comparator comp coll]
(if (seq coll)
(let [a (to-array coll)]
(. java.util.Arrays (sort a comp)) ; Here
(seq a))
())))
显然,java.util.Arrays.sort
使用a,根据Wikipedia,它的最坏运行时为O(n logn)
为了验证,在IntelliJ中的ctrl+B兔子洞之后,我最终在带有签名的
排序处结束:
public static <T> void sort(T[] a, Comparator<? super T> c)
因此,除非用户要求它使用旧的合并排序实现,否则它似乎确实使用了Timsort 查看源代码,您可以看到它只是委托给java.util.Arrays.sort
:
(defn sort
([coll]
(sort compare coll))
([^java.util.Comparator comp coll]
(if (seq coll)
(let [a (to-array coll)]
(. java.util.Arrays (sort a comp)) ; Here
(seq a))
())))
显然,java.util.Arrays.sort
使用a,根据Wikipedia,它的最坏运行时为O(n logn)
为了验证,在IntelliJ中的ctrl+B兔子洞之后,我最终在带有签名的排序处结束:
public static <T> void sort(T[] a, Comparator<? super T> c)
因此,除非用户要求它使用旧的合并排序实现,否则它似乎确实使用了Timsort 实际调用:
泛型对象值上的Java排序有以下注释(添加了强调):
实现说明:此实现是一种稳定、自适应、迭代的mergesort,当输入数组被部分排序时,需要的比较远远少于n lg(n),同时在输入数组被随机排序时提供传统mergesort的性能。如果输入数组几乎已排序,则实现需要大约n次比较。临时存储要求从几乎排序的输入数组的小常量到随机排序的输入数组的n/2对象引用
该实现在其输入数组中同等利用升序和降序,并且可以在同一输入数组的不同部分中利用升序和降序。它非常适合合并两个或多个已排序的数组:只需连接数组并对结果数组进行排序
该实现改编自Tim Peters的Python列表排序(TimSort)。它使用了Peter McIlroy在《第四届ACM-SIAM离散算法年度研讨会论文集》(第467-474页,1993年1月)上发表的“乐观排序和信息论复杂性”中的技术
但是,对于基元类型(如for),还有其他重载方法,对于这些方法,以下内容适用:
排序算法是Vladimir Yaroslavskiy、Jon Bentley和Joshua Bloch提出的双枢轴快速排序算法。此算法在许多数据集上提供了O(n log(n))性能,这些数据集会导致其他快速排序降级为二次性能,并且通常比传统(单轴)快速排序实现更快
复杂性还取决于自定义比较算法的复杂性。实际调用:
泛型对象值上的Java排序有以下注释(添加了强调):
实现说明:此实现是一种稳定、自适应、迭代的mergesort,当输入数组被部分排序时,需要的比较远远少于n lg(n),同时在输入数组被随机排序时提供传统mergesort的性能。如果输入数组几乎已排序,则实现需要大约n次比较。临时存储要求从几乎排序的输入数组的小常量到随机排序的输入数组的n/2对象引用
该实现在其输入数组中同等利用升序和降序,并且可以在同一输入数组的不同部分中利用升序和降序。它非常适合合并两个或多个已排序的数组:只需连接数组并对结果数组进行排序
该实现改编自Tim Peters的Python列表排序(TimSort)。它使用了Peter McIlroy在《第四届ACM-SIAM离散算法年度研讨会论文集》(第467-474页,1993年1月)上发表的“乐观排序和信息论复杂性”中的技术
但是,对于基元类型(如for),还有其他重载方法,对于这些方法,以下内容适用:
排序算法是Vladimir Yaroslavskiy、Jon Bentley和Joshua Bloch提出的双枢轴快速排序算法。此算法在许多数据集上提供了O(n log(n))性能,这些数据集会导致其他快速排序降级为二次性能,并且通常比传统(单轴)快速排序实现更快
复杂性还取决于自定义比较算法的复杂性。@Carcigenicate我同时编辑过,重载方法之间似乎存在差异。@Carcigenicate我同时编辑过,重载方法之间似乎存在差异。如果您没有看到下面的JavaDocs,请务必阅读JavaDocs:如果您没有看到下面的JavaDocs,请务必阅读JavaDocs: