NBR-hugh / freecodecamp-practice

Practice everyday
0 stars 0 forks source link

sort按顺序排列数组元素的原理是什么?理解的不是十分清楚 #17

Open NBR-hugh opened 8 years ago

NBR-hugh commented 8 years ago

FCC中的解释:

Sort Arrays with sort You can use the method sort to easily sort the values in an array alphabetically or numerically. Unlike the previous array methods we have been looking at, sort actually alters the array in place. However, it also returns this sorted array. sort can be passed a compare function as a callback. The compare function should return a negative number if a should be before b, a positive number if a should be after b, or 0 if they are equal. If no compare (callback) function is passed in, it will convert the values to strings and sort alphabetically.

主要是这一段:

sort can be passed a compare function as a callback. The compare function should return a negative number if a should be before b, a positive number if a should be after b, or 0 if they are equal.

sort 可以通过比较函数作为回调函数(callback),假如 比较函数返回的是负值则a应该在b前,正值则b在a前,0则二者相等。

ok,那么新的疑问,回调函数(callback)是什么?

知乎的高分回答: image

sf上的回答 这个解释get到点:

在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。

ok,理解了回调函数是什么,那么迁移至具体情境,sout中比较函数是回调函数,即函数A, 那么函数B是什么呢?其中的运行原理无法理解

soyaine commented 8 years ago

hello 我在开智自我介绍那里知道了你(我也在准备做前端工程师),所以到你的 Github 来看看。

看一个例子你就明白了。

arr.sort(function(a, b) {
    return a - b;
});

这里 sort() 是函数 B,作为它的参数的 function(a, b) 就是函数 A 这种用法的实际应用场景有: 因为用 sort() 进行排序时,是把元素转成 String 类型进行排序, 就会出现 [1, 11, 2, 3] 这样的情况,利用 sort() 可以接受一个函数作为参数的特性, 将参与比较的元素进行相减处理,这时则是根据函数的返回值进行排序。 你再回看这句话:

比较函数返回的是负值则a应该在b前,正值则b在a前,0则二者相等。

可能就比较好理解了。

NBR-hugh commented 8 years ago

@soyaine
恩,谢谢您的解释。 :-D 我原来的困惑是对sort排序功能如何实现的困惑,想着能不能写个具体的function把它表现出来,猜想应该是个根据a-b大于0,小于0,等于0三种情况对元素位置进行操作的函数,具体实现的话就有些烧脑了,想着刚刚开始学还是先把命令用熟练再去细究,就暂时放一边了,不过对您的回答有一个困惑: 我的理解不同的点操作性质对应的对象是不同的,sort的操作对象应该是array而不是string,您是如何得知

因为用 sort() 进行排序时,是把元素转成 String 类型进行排序

个人不是很理解转化的必要性,您是看过sort的具体实现代码么?

soyaine commented 8 years ago

@NBR-hugh O(∩_∩)O~不用称呼您,我和你一样大四。

sort() 排序转化为字符形式,是在 Mozilla 文档里提及的: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

If compareFunction is not supplied, elements are sorted by converting them to strings and comparing strings in Unicode code point order.

若没有提供 sort() 中的方法参数,会转换为字符进行比较排序;若提供了,则是根据参数中的方法的返回值进行排序。

另外你提到的 sort() 实现的代码在这里: https://github.com/v8/v8/blob/master/src/js/array.js

710 行开始是 sort() 的实现 用了快速排序(760 行)和插入排序(726 行),插入排序在数组元素数量小于等于 22 的时候使用。

但这只是 V8 引擎的实现,其他引擎可能内部实现机制不一样。