我想让这个冒泡排序函数工作,但它给了我超过最大调用堆栈大小的值


function bubbleSort(arr) {
    var temp = arr.slice(0)
    for (var i = 0; i < arr.length; i ++) {
        if (arr[i + 1] < arr[i]) {
            var temp_1 = arr[i+1]
            var temp_2 = arr[i]
            arr[i] = temp_1
            arr[i+1] = temp_2
        }
    }
    if (temp != arr) {
        return bubbleSort(arr)
    }
    return arr
}
console.log(bubbleSort([2,1,5,4,10,7,6,9,3,8]))

我不看算法,因为我认为你说得对。你的问题是数组之间的比较。尝试使用此功能

JSON.stringify(temp) !== JSON.stringify(array);

这里的温度太高了数组总是返回true,您可以通过添加来看到它

 console.log(temp !== array)

在比较之前。

解释:JSON#stringify比较从数组中获得的两个字符串。另一种实现比较的方法是逐一比较所有项目的长度和相等性。如果您使用"接线员,你总是什么都得不到,只有";真";因为这两个阵列是对象的两个不同实例

完整代码

function bubbleSort(arr) {
var temp = arr.slice(0);
for (var i = 0; i < arr.length; i ++) {
    if (arr[i + 1] < arr[i]) {
        var temp_1 = arr[i+1];
        var temp_2 = arr[i];
        arr[i] = temp_1;
        arr[i+1] = temp_2;
    }
}
    if (JSON.stringify(temp) !== JSON.stringify(arr)) {
         return bubbleSort(arr);
    }
         return arr
    }
  1. 运算符==!=正在比较引用,因此它们总是将两个数组视为不同的数组(除非比较同一实例(。检查['a'] == ['a']:它将是false。您可以使用标志来指示发生了更改:
function bubbleSort(arr) {
  var temp = arr.slice(0)
  var changed = false
  for (var i = 0; i < arr.length; i ++) {
      if (arr[i + 1] < arr[i]) {
          changed = true
          var temp_1 = arr[i+1]
          var temp_2 = arr[i]
          arr[i] = temp_1
          arr[i+1] = temp_2
      }
  }
  if (changed) {
      return bubbleSort(arr)
  }
  return arr
}
  1. 一旦您不知道输入数组的长度以及它离排序状态有多近,在某些情况下您仍然可能会遇到同样的问题,所以最好用循环代替递归:
function bubbleSort(arr) {
  var changed = false
  do {
    var temp = arr.slice(0)
    changed = false
    for (var i = 0; i < arr.length; i ++) {
        if (arr[i + 1] < arr[i]) {
            changed = true
            var temp_1 = arr[i+1]
            var temp_2 = arr[i]
            arr[i] = temp_1
            arr[i+1] = temp_2
        }
    }
  } while (changed);
  return arr
}

最新更新