如何正确地对整数数组进行排序

1388

尝试从一个我知道只包含整数的数组中获取最高和最低值似乎比我想象的更难。

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

我希望它展示的是99, 104, 140000,但实际上它展示的是104, 140000, 99。因此看起来排序函数将这些值视为字符串。

有没有办法让排序函数按照整数值进行排序?


6
顺便说一下,如果你要排序大量的整数,最好使用类似于计数排序这样的整数排序算法。计数排序所需运行的时间与数组大小成线性关系:O(n)。而本文中提供的所有解决方案都使用比较排序,效率较低:O(n * log n)。 - Web_Designer
4
计数排序在考虑数字范围时是线性的,而不是考虑数组大小。例如,对于[1,1000000]进行排序需要超过2步,因为算法必须扫描1到1000000之间的每个数组索引,以查看哪个单元格的值大于0。 - yters
10
JS仍然存在这个bug,这相当疯狂。 - user894319twitter
6
@user894319twitter说:"这太不真实了,我真的只能称之为一个 bug。如果这在规范中,那么他们在规范中指定了一个 bug。这是一个 bug。" - gjvdkamp
2
我真的很想知道是什么思维过程导致了这个结论:“这是sort()的一个很好的实现”。 - Welcor
显示剩余5条评论
32个回答

0
由于sort方法将数组元素转换为字符串,因此以下方式也可用于包含十进制数字的数组元素。
let productPrices = [10.33, 2.55, 1.06, 5.77];
console.log(productPrices.sort((a,b)=>a-b));

并且会给你期望的结果。


1
“sort方法不会将数组元素转换为字符串。” - Sebastian Simon

-1
  1. 升序

    const movements = [200, 450, -400, 3000, -650, -130, 70, 1300];

如果我们返回 < 0 的值,则 A 将在 B 之前 如果我们返回 > 0 的值,则 B 将在 A 之前

 movements.sort((a, b) => {
      if (a > b) return 1; //- (Switch order)
      if (a < b) return -1; //- (Keep order)
    });

a - 当前值,b - 下一个值。

  1. 降序

    movements.sort((a, b) => { if (a > b) return -1; // - (保持) if (a < b) return 1; // - (交换) });

!改进,最佳解决方案!

movements.sort ((a, b) => a - b); // Same result!

如果 a < b,则为负数(切换) 如果 a < b,则为负数(保持)


你的最后一位有一个错别字,导致了矛盾修辞。你的第一部分没有解决a==b的情况。要格式化内联代码,请用单个反引号将其括起来。 - SherylHohman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接