【问题标题】:The inner workings of JavaScript Array.sort([compareFunc]);JavaScript Array.sort([compareFunc]); 的内部工作原理
【发布时间】: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;

});

所以,我是这样解决的:

  1. 40-20 = 20 = (>0) 所以 b,a 或 20,40

  2. 230-65 = 165 (>0) 所以 b,a 或 230,65

  3. 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


【解决方案1】:

该实现使用快速排序算法。阅读它here

【讨论】:

  • 哥...我爱你!!谢谢!会深入研究的。只是不明白 JavaScript 如何“选择”这个数字。如果我用 3 个数字数组执行此操作,我可以通过 2 次计算得出答案,但 JavaScript 会 3...?
【解决方案2】:

给定一个包含 N 个元素的数组,有 N 个阶乘排列,其中只有一个被排序。由于每次比较都会将排列分成两组,因此应该进行 O(log(N!)) 次比较,以便确定元素是否有序的排列,尽管这取决于算法和原始排列。

在原始 4 元素数组的情况下,您可以编写一个自定义排序例程,该例程不对原始数组做任何假设,并保证在 5 次比较中对数组进行排序,但在三分之一的情况下它会很幸运并且只使用4比较。另一方面,冒泡排序只需要 3 次比较,以防数组已经排序,但通常需要 6 次比较。大多数浏览器使用具有众所周知的性能特征的标准通用排序算法之一。

【讨论】:

  • 自从最初提出这个问题以来,我已经在纸上和 JavaScript 中做了一些排序,我“感觉”好像我理解它,因为我很自然地理解它,如果这有任何意义的话.我认为冒泡排序(插入等)是比快速排序更难理解的算法,快速排序似乎更线性,此外,如果 Gor 是正确的,那么 JavaScript 使用快速排序,并且在 JavaScript 的上下文中(不是 c++ )然后我需要(想要)完全理解快速排序。不过谢谢你的回答,没有bs。我喜欢。 :D
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 2015-08-21
  • 2014-01-22
  • 1970-01-01
  • 2018-07-28
  • 2019-06-29
  • 2022-05-21
  • 2019-12-28
相关资源
最近更新 更多