说说Array.prototype.sort()

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)

上面代码是实现数组乱序的方法之一,其中的原理就是改变返回值的大小


说说Array.prototype.sort()_第1张图片
image.png

我们将每一次的result的值都打印出来,并将最终的arr也打印出来,为5,3,4,1,2,那么这个值是如何得出来的呢?
我将用一张图来详细说明:


说说Array.prototype.sort()_第2张图片
image.png

刚开始的时候是一个负数,将第一个数字与第二个数字对比 ,不改变位置;
第二个是正数,将第二个数字与第三个数字对比,交换位置;
第三个是正数,因为刚才已经交换过位置了,要往前推,将第一个数字与第二个数字对比,交换位置;
第四个是正数,将第三个数字与第四个数字对比,交换位置;
。。。。。。
以此类推,最终得出53142,简单的来说就是插入排序啦

你可能感兴趣的:(说说Array.prototype.sort())