我最近想向别人介绍如何 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/