javascript - Array.sort 的这个中间阶段发生了什么?

标签 javascript arrays

在深入研究数组方法时,我决定看一下 Array.sort 方法中涉及的步骤。看一下这段代码,用于反转数组的顺序:

let arr = [];

for (let i = 1; i < 6; i++) {
  arr.push(i);
}

arr.sort((value1, value2) => {
  console.log(arr);
  console.log(`Comparing ${value1} : ${value2}`);
  return value2 - value1;
});

console.log(arr);

我得到这个输出:

[1, 2, 3, 4, 5]
Comparing 1 : 2
[2, 1, 3, 4, 5]
Comparing 1 : 3
[2, 1, 1, 4, 5]
Comparing 2 : 3
[3, 2, 1, 4, 5]
Comparing 1 : 4
[3, 2, 1, 1, 5]
Comparing 2 : 4
[3, 2, 2, 1, 5]
Comparing 3 : 4
[4, 3, 2, 1, 5]
Comparing 1 : 5
[4, 3, 2, 1, 1]
Comparing 2 : 5
[4, 3, 2, 2, 1]
Comparing 3 : 5
[4, 3, 3, 2, 1]
Comparing 4 : 5
[5, 4, 3, 2, 1]

前两步很有意义,但请看第三步:[2, 1, 1, 4, 5]

当我期望 [2, 3, 1, 4, 5] 时,为什么会出现这种情况?

如您所见,这种重复的数字现象一次又一次地出现,直到数组最终被反转。我错过了什么?很明显,在 arr 中的每个突变之后,它都保留了数组的副本。

最佳答案

当数组是小型浏览器(好吧……至少是 chrome、safari 和 node)时使用插入排序。您看到的行为是在插入排序循环中间查看数组的结果。您可以通过以下方式重现它:

let arr = [ 1, 2, 3, 4, 5];

function InsertionSort(a, comparefn) {
    let from = 0
    let to = a.length
    for (var i = from + 1; i < to; i++) {
      var element = a[i];
      for (var j = i - 1; j >= from; j--) {
        var tmp = a[j];
        var order = comparefn(tmp, element); //<-- your console.log is peaking at the array here
        if (order > 0) {
          a[j + 1] = tmp;
        } else {
          break;
        }
      }
      a[j + 1] = element;
    }
  };

InsertionSort(arr,  (a,b) => {
    console.log(arr.join(","))
    return b-a
})
console.log(arr)

请记住,这不是必需的实现,因此您不必指望这种行为。

关于javascript - Array.sort 的这个中间阶段发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52374681/

相关文章:

javascript - 在 jQuery 链中调用 JavaScript 函数

javascript - 如何格式化从 Object.values 中获取的 JSON 数据字符串?

javascript - Chrome 扩展程序中弹出窗口关闭后记住数组

c++ - Arduino 错误 (C++) : invalid use of non-static data member

javascript - 将多维数组函数重构为 ES6

javascript - 如何使用仅具有 'Data-capture' 且没有类的 JQuery 单击按钮?

javascript - 循环访问远程数据

javascript - 管理 Node.js Redis 客户端中的唯一哈希键

javascript - 将 Json 数组内的数组映射到 Angularjs 范围

javascript - 具有多色段的折线图