我正在和一位同事一起重写一系列算法,我们将在稍后发布社区数据包。
首先,我选择了典型的布雷排序算法。
请注意,“纯粹”并不意味着它的内部代码不会有杂质。它仅仅意味着函数的PUBLIC API必须是纯粹的,并且它不得影响其范围之外的任何东西。
JDK 6
我正在寻找可能影响目标1和3的代码中的任何缺陷。
我也在寻找提高效率的方法,因为我确定垃圾收集器是否非常喜欢递归(在大多数浏览器中还没有实现尾调用优化......)。
答案 0 :(得分:2)
关于目标1,你的代码在纯粹方面做得很好 - 它只是克隆了一切。
但这与目标3不太一致。虽然recursiveSort
的复杂性是预期的O(n²)
,但克隆数组的整个内容会给复杂性带来额外的负担,这现在不仅取决于输入数组的长度,还取决于大小和元素的深度。由于排序不会改变元素,这是毫无意义的 - 你可以而且应该只返回一个包含原始对象的新数组。纯度的一个主要目标是允许分享!
所以使用
function bubbleSorted(array, fnCompare = defaultCompare) {
if (typeof fnCompare != "function")
throw new Error("fnCompare must be a function");
if (!Array.isArray(array))
throw new Error("array must be an Array");
return recursiveSort(array.slice(), array.length, fnCompare);
}
另请注意,您有不必要的许多基本案例。您的算法只需要在swapped
为假时停止。您无需对数组长度0
或1
进行额外测试。