使泡泡排序纯净,高效

时间:2017-11-17 11:10:34

标签: javascript algorithm bubble-sort

背景

我正在和一位同事一起重写一系列算法,我们将在稍后发布社区数据包。

首先,我选择了典型的布雷排序算法。

目标

  1. 该功能必须是纯粹的
  2. 一定要高效
  3. 必须遵守https://en.wikipedia.org/wiki/Bubble_sort
  4. 中列出的复杂性

    请注意,“纯粹”并不意味着它的内部代码不会有杂质。它仅仅意味着函数的PUBLIC API必须是纯粹的,并且它不得影响其范围之外的任何东西。

    代码

    JDK 6

    我想要什么?

    我正在寻找可能影响目标1和3的代码中的任何缺陷。

    我也在寻找提高效率的方法,因为我确定垃圾收集器是否非常喜欢递归(在大多数浏览器中还没有实现尾调用优化......)。

1 个答案:

答案 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为假时停止。您无需对数组长度01进行额外测试。