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
}
- 运算符
==
和!=
正在比较引用,因此它们总是将两个数组视为不同的数组(除非比较同一实例(。检查['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
}
- 一旦您不知道输入数组的长度以及它离排序状态有多近,在某些情况下您仍然可能会遇到同样的问题,所以最好用循环代替递归:
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
}