javascript - Array.prototype.sort 临时复制内容?

标签 javascript sorting

我最近想向别人介绍如何 Array.prototype.sort使用自定义方法在任何给定时间比较两个值,并决定它们是应该交换还是单独保留。我决定在每次比较期间记录数组,以便可以看到上一次比较的结果。当我记录数组时,我注意到某些时刻数组的状态有些奇怪。

假设如下:

var num = [ 2, 1, 8, 5, 3 ];

num.sort( comparator );

function comparator ( a, b ) {
    console.log( num ); // Current state of num
    return a - b; // Order values numerically
}

这是输出:

[ 2, 1, 8, 5, 3 ] // Comparing 2 and 1
[ 1, 2, 8, 5, 3 ] // Comparing 2 and 8
[ 1, 2, 8, 5, 3 ] // Comparing 8 and 5
[ 1, 2, 8, 8, 3 ] // Comparing 2 and 5
[ 1, 2, 5, 8, 3 ] // Comparing 8 and 3
[ 1, 2, 5, 8, 8 ] // Comparing 5 and 3
[ 1, 2, 5, 5, 8 ] // Comparing 2 and 3

数组已正确排序 ([ 1, 2, 3, 5, 8 ]),但我仍然对集合本身的某些传递摸不着头脑。

怎么在第4次迭代时8出现了两次,暂时代替了5。再次,8 出现两次,两次迭代后暂时替换 3。最后,5 出现了两次,在上一次迭代中临时替换了 3。

请注意,上面的代码是在 Chrome 中运行的。

最佳答案

有趣,但并不令人惊讶。

在这个例子中它似乎使用了一个简单的插入排序算法。

类似的东西:

  • 获取项目[1]
  • 将其下方的每个项目向上移动一个,直到找到一个较低的项目,然后将其放在该项目之上
  • 获取项目 [2]
  • 将它下面的每个项目向上移动一个,直到找到一个更低的项目,然后将它放在这个项目的上面
  • 获取项目 [3]
  • (续)

在描述冒泡排序算法时,您通常会想象每个元素都沿着数组交换,直到找到它的位置。但是将项目存储到临时变量中比交换它更有效。

关于javascript - Array.prototype.sort 临时复制内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19258966/

相关文章:

arrays - 如果输入数组定义为 const,如何对其进行排序?

linux - Bash 脚本对文件进行排序,然后转储到文件中

javascript - 使用 PreventDefault 覆盖打开新选项卡

javascript - mongo shell JavaScript 相当于 --sslCAFile

javascript - 如何通过 XMLHttpRequest() post 请求传递 base64encode 字符串

java - 为什么我的短语查询给我的结果这么少?

javascript - YQL中可以添加UserAgent吗?

javascript - *日历程序* 无法为该日历程序编写循环以正确显示

algorithm - 这个(选择排序)算法的运行时间是如何计算的?

python - Python 中错误的输出顺序