【发布时间】:2011-02-13 13:35:45
【问题描述】:
当传递一个简单的比较函数时,我正在努力“查看”对 Array.sort() 的调用中发生了什么。我已经做到了这一点,但数字似乎从未加起来,我想知道 JavaScript 是如何得出结论的。也许我错过了其中的一些基本点。
var nums = new Array(40,20,230,65);
var b = a.sort(function(a,b){
return a-b;
});
所以,我是这样解决的:
40-20 = 20 = (>0) 所以 b,a 或 20,40
230-65 = 165 (>0) 所以 b,a 或 230,65
40-65 = -25 (
我用这些数字运行它,它做了三个计算,得出 20,40,65,230,这是正确的,但我不知道“如何”......它以什么方式选择数字来放置进入生成的排序数组。我的意思是,我从答案中得到了六个数字(三个计算的结果),那么如何将这六个变成必要的四个呢?
任何帮助。我真的很想从里到外理解这一点。 :)
编辑:好的,我现在看到它是如何工作的,它与原始数组混在一起,根据排序函数返回的值重新排序数字。但是当我使用一个由四个数字组成的数组时,我可以用两个“移动”来计算它,但是 JavaScript 做了三个,最后一个似乎有点无关紧要。试试看。 :)
最后也是最好的更新!!
好的,自从提出这个问题以来,我一直在纸上和 JavaScript 上胡思乱想,我发现了快速排序是如何工作的。我对日志不感兴趣,但我想这会教会我在数学上更加专注。
为了节省空间,我拿出了最后一个示例,所以这是我执行的另一个示例,以及它是如何进行的。它与我在纸上所做的完全相同的排序匹配,除了 JS 从数组中选择的要排序的数字对的顺序有些不可预测,所以它实际上做了比我需要做的更多的比较,但我想这是因为我可以提前考虑结果并根据需要选择成对的数字(非常不像计算机)。
在这个测试中我做了六次计算,JS做了十次,公平地说更彻底。
数组 == 2,16,7,3,10
2 - 16 == -14 (
16 - 7 == 9 (>0) | 2,7,16,3,10
16 - 3 == 13 (>0) | 2,7,3,16,10
16 - 10 == 6 (>0) | 2,7,3,10,16
2 - 7 == -5 (
7 - 3 == 4 (>0) | 2,3,7,10,16
数组 == 2,3,7,10,16
不确定这是否是严格意义上的快速排序,因为快速排序使用枢轴数字并将其用作在排序中划分数组的中心点。但这是我对 JS 是如何做到的的理解。如我错了请纠正我。 :)
【问题讨论】:
-
你不能只使用两个比较进行排序,
[4,2,1,3]在最好的情况下只能变成[2,4,1,3]。 -
如果您使用没有比较函数的 Array.sort() ,它会按字典顺序(按字典顺序)排序。但是,如果您通过了一些排序标准,例如“a-b”,那么您就可以控制排序。因此 [4,2,1,3] 将变为 [1,2,3,4] ......这就是我对它的理解。 :)
标签: javascript arrays sorting