我试图理解sort()
函数如何与传递给它的回调函数一起工作。更具体地说,a
和b
示例代码:
var n = [4, 11, 2, 10, 3, 1];
n.sort(function(a, b) {
console.log(a);
console.log(b);
console.log('--')
return a-b;
});
结果:
4
11
--
11
2
--
4
2
--
11
10
--
4
10
--
11
3
--
10
3
--
4
3
--
2
3
--
11
1
--
10
1
--
4
1
--
3
1
--
2
1
--
第一轮我可以关注a
= 4,b
= 11,很容易理解。
第二轮我可以关注a
= 11和b
= 2。
但在那之后我对实际发生的事情进行了松散的跟踪,例如当你到达a
= 4和b
= 3时。这实际上是如何工作的?我尝试在纸上进行操作,但无法在a
和b
的输出中看到逻辑。
答案 0 :(得分:1)
你可以这样看。当你有两个数字时,比较a(前一个)和b(下一个)
如果a大于b,则将其放在b。
之后
如果a小于b,则将其放在b之前
事实上,如果你有案例&a;> b',您可以返回任何正数:放b后.b
并且,当你有案例&a 39; a< b',你可以返回任何负数:在b之前放一个。
它实际上是一次比较2个数字。
阵列中的位置可以理解如下。
从return a-b
的角度来看,如果你返回一个负数,则先放一个b;如果你返回一个正数,请输入一个后b。
负数 - 零 - 正数。
也许,您可以通过在运行时打印出n中的内容来更好地理解它。
window.n = [4, 11, 2, 10, 3, 1];
n.sort(function(a, b) {
console.log(a);
console.log(b);
console.log(window.n); // You can see what is in n in the every comparison
console.log('--')
return a-b;
});
Chrome v64.0.3282上的结果
4
11
(6) [4, 11, 2, 10, 3, 1]
--
11
2
(6) [4, 11, 2, 10, 3, 1]
--
4
2
(6) [4, 11, 11, 10, 3, 1]
--
11
10
(6) [2, 4, 11, 10, 3, 1]
--
4
10
(6) [2, 4, 11, 11, 3, 1]
--
11
3
(6) [2, 4, 10, 11, 3, 1]
--
10
3
(6) [2, 4, 10, 11, 11, 1]
--
4
3
(6) [2, 4, 10, 10, 11, 1]
--
2
3
(6) [2, 4, 4, 10, 11, 1]
--
11
1
(6) [2, 3, 4, 10, 11, 1]
--
10
1
(6) [2, 3, 4, 10, 11, 11]
--
4
1
(6) [2, 3, 4, 10, 10, 11]
--
3
1
(6) [2, 3, 4, 4, 10, 11]
--
2
1
(6) [2, 3, 3, 4, 10, 11]
--
(6) [1, 2, 3, 4, 10, 11] // result
您的代码返回与以下相同的结果:
var n = [4, 11, 2, 10, 3, 1];
n.sort(function(a, b) {
console.log(a);
console.log(b);
console.log('--')
if (a > b) {
return 1;
} else {
return -1;
}
});
(6) [1, 2, 3, 4, 10, 11] // result
OR
var n = [4, 11, 2, 10, 3, 1];
n.sort((a, b) => a > b ? 1 : -1);
(6) [1, 2, 3, 4, 10, 11] // result
答案 1 :(得分:1)
看起来像是修改后的冒泡排序。在比较每一步的数组状态时,您可以看到发生了什么 - 我在下面添加了它们。
将索引1中的值尽可能低地移动。 (索引0-1是有序的) 现在将索引2中的值移动到应该的最低值。 (索引0-2是有序的) 现在将索引3中的值移动到应该的最低值。 (索引0-3是有序的)
因为我们知道有多少数组是为了使比较短路并且只要比较函数不是负数就跳转到下一个索引。
4
11
-- [4, 11, 2, 10, 3, 1];
11
2
-- [4, 2, 11, 10, 3, 1];
4
2
-- [2, 4, 11, 10, 3, 1];
11
10
-- [2, 4, 10, 11, 3, 1];
4
10
-- [2, 4, 10, 11, 3, 1];
11
3
-- [2, 4, 10, 3, 11, 1];
10
3
-- [2, 4, 3, 10, 11, 1];
4
3
-- [2, 3, 4, 10, 11, 1];
2
3
-- [2, 3, 4, 10, 11, 1];
11
1
-- [2, 3, 4, 10, 1, 11];
10
1
-- [2, 3, 4, 1, 10, 11];
4
1
-- [2, 3, 1, 4, 10, 11];
3
1
-- [2, 1, 3, 4, 10, 11];
2
1
-- [1, 2, 3, 4, 10, 11];