Array.prototype.sort暂时复制内容?

时间:2013-10-08 21:39:44

标签: 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 ]),但我仍然对集合本身的一些传递感到头疼。

8如何在迭代4中出现两次,暂时替换为5。再次,8出现两次两次迭代,之后暂时替换3次。最后,5出现两次,在最后一次迭代中暂时替换为3。

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

1 个答案:

答案 0 :(得分:2)

有趣,但并不太令人惊讶。

在这种情况下似乎使用了简单的插入排序算法。

有些事情:

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

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

相关问题