JS数组方法 sort() 排序规则解析

我们用一个数组来测试 sort 函数的排序方法,以升序为例。

打印参数 m、n,可以知道这个函数中究竟传入了什么值,借此就可以判断比较的方法:

const a = [3,1,5,4,8,9,32,19,6,21,77,64,15];
a.sort((m,n) => {
  console.log( `m=${m},n=${n}` )
  return m-n;
})
console.log( a )

来看一下打印结果,

排序算法为:二分折半排序,整个查找元素的过程,用到的方法其实就是折半查找,给大家画个图,带大家一探究竟:

这里我们先跳过前面7个元素的排序过程,因为整个比较过程所用到的方法是相同的。

我们发现:

  • 首先会选择19前面的7个数字中,中间的那个数字(中间数字下标的计算方法:首尾下标的和的/2,将结果向上取整,例如3/2结果是1.5,向上取整得到的就是2),和其进行比较,
    • 当大于这个数字时,就和其后面的元素再进行折半查找,
    • 当小于这个数字时,就和其前面的元素进行折半查找,
  • 直到找到一个位置,满足大于其前面的数字,小于其后面的数字。
  • 小于首元素时,就将这个数字放数组的头部,大于尾元素时,就将这个数字放数组的尾部。

总结:JS的 sort() 排序,用到的是折半查找的方法。

注意,不能以 0 作为参考的分界线,也就是说,不是说 m - n > 0 就是降序,m - n < 0 就是升序,因为我们根本不能保证每次传入的两个参数谁大谁小。通过上面的图可以看到,m 表示新加入的要进行排序的元素,而 n 表示折半查找到的元素,这两者的大小关系不不是确定的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦田里的POLO桔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值