js中原生的sort()采用快排和插入排序算法,根据比较器对数组排序。
默认是将数组元素转为字符串,然后根据Unicode字符集编号的大小排序。
1.没有参数
当我们要将数组中的元素进行排序的时候,我们可以使用sort()方法
var arr = [5,8,2,6,7,9]
arr.sort()
console.log(arr) // [2, 5, 6, 7, 8, 9]
如上可以将数组进行由小到大的排列,但是因为sort方法默认是将数组元素转为字符串,然后根据Unicode字符集编号的大小排序的,所以会出现以下问题
var arr = [5,8,2,6,7,9,11]
arr.sort()
console.log(arr) // [11,2, 5, 6, 7, 8, 9]
上面可以看出虽然11比2小但是11却排在了2的前面,所以我们有什么方法解决这个问题呢??
2.有参数
其实sort方法里面是可以传入参数的
我们可以传入一个带参数的函数进行排序
var arr = [5,8,2,6,7,9,11]
arr.sort(function(a, b) {
return a-b
})
console.log(arr) //[2, 5, 6, 7, 8, 9, 11]
这样就可以进行完美的从小到大的排序啦!!!!那么从大到小的排序如何实现呢?其实只有换个返回值就ok啦,例如:
var arr = [5,8,2,6,7,9,11]
arr.sort(function(a, b) {
return b-a
})
console.log(arr) //[11, 9, 8, 7, 6, 5, 2]
3.排序过程是怎么样的?
上面的例子我们虽然知道了如何使用sort方法进行大到小或者小到大的排序,但是这里面有什么样的过程呢?
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值
若 a 等于 b,则返回 0
若 a 大于 b,则返回一个大于 0 的值
换一句话说那就是比较函数的返回值如果是负数或则为0的话,不改变位置,如果返回值大于0的话换位置
我们来看个例子:
var arr = [1,2,3,4,5]
arr.sort(function() {
var result = Math.random() - 0.5
console.log(result)
return result
})
console.log(arr)
上面代码是实现数组乱序的方法之一,其中的原理就是改变返回值的大小
我们将每一次的result的值都打印出来,并将最终的arr也打印出来,为5,3,4,1,2,那么这个值是如何得出来的呢?
我将用一张图来详细说明:
刚开始的时候是一个负数,将第一个数字与第二个数字对比 ,不改变位置;
第二个是正数,将第二个数字与第三个数字对比,交换位置;
第三个是正数,因为刚才已经交换过位置了,要往前推,将第一个数字与第二个数字对比,交换位置;
第四个是正数,将第三个数字与第四个数字对比,交换位置;
。。。。。。
以此类推,最终得出53142,简单的来说就是插入排序啦