JavaScript中的三种常见的数组排序

js中的三种常见的数组排序方法有,js原生存在的排序函数sort(),冒泡排序,选择排序

一、sort()函数:

不给sort()传参
var numArr = [45,63,24,16,79];  
    console.log(numArr.sort());     // [16, 24, 45, 63, 79]
    console.log(numArr);            // [16, 24, 45, 63, 79]

会按照升序的方式对原数组进行排序,并将排序结果返回。
我们再多试几个例子来验证函数的准确性

    var numArr = [12,42,321,152];
    console.log(numArr.sort());     // [12, 152, 321, 42]
    console.log(numArr);            // [12, 152, 321, 42]

这个时候就会发现结果好像和我们想象的不一样,为什么42成了最大的了。事实上,sort()是按照字符编码的顺序进行排序,默认比较的时候会将数组的元素都转换成字符串,而字符串的比价规则是:诸位比较,得到结果就停止。所以我们才会得到上面这个例子的"不正确"排序。

在给sort()传参后:

sort传入的参数必须是函数;传一个回调函数

   var numArr = [12,42,321,152];
   console.log(numArr.sort(function(z,x){
        return z-x;
   }));                        // [12, 42, 152, 321]

这里我们看到返回的结果是按照正常的数字进行排序,实际上这种用法的规则是第一个参数z减第二个参数x为升序排序,如果是第二个参数x减去第一个参数z,就会进行降序的排序。

二、冒泡排序

冒泡排序的思路:重复遍历数组中的元素,依次比较两个相邻的元素,如果前一个元素大于后一个元素,就依靠第三个变量将它们换过来,直到所有元素遍历完。

   var arr = [6,3,2,4,1];
   for(var i=0;i<arr.length-1;i++){                    // 大循环,确定执行几轮(确定行)
       for(var j=0;j<arr.length-1-i;j++){          // 小循环,每轮执行多少次(每行的列)
           if(arr[j] > arr[j+1]){                  // 开始判断了,将当前位置和后一位作比较,大的放后面
               var ls = arr[j];                        // 交换
               arr[j] = arr[j+1];
               arr[j+1] = ls;
           }
       }
   }
   console.log(arr);

三、选择排序

选择排序的思路:每次拿出一个数据,和其他所有数字相比较,得到大的或小的,与初始位置做交换

    for(var i=0;i<arr.length-1;i++){
        // 假设,将第一位保存出来,用来和后面所有作比较
        // 假设,第一位是最小值
        var iNow = arr[i];
        // 立即将假设的最小值的位置,也存出来
        var iNowIndex = i;
        for(var j=i+1;j<arr.length;j++){
            // 验证假设第一位是最小的正确性,不正确,就拿到比假设的值还小的值
            if(iNow > arr[j]){
                iNow = arr[j];
                iNowIndex = j;
            }
        }
        // 小循环执行结束后,iNow必然是最小值,此时此刻数组还没有发生变化
        var ls = arr[i];
        arr[i] = iNow;
        // 上面是将最小值,放在第一位
        // 第一位原本的数据,放在,原本最小值的位置,原本最小值得是哪呢?
        arr[iNowIndex] = ls;
    }
    console.log(arr);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值