zoukankan      html  css  js  c++  java
  • javascript:算法之数组sort排序

    数组sort排序

    sort比较次数,sort用法sort常用

    描述

    方法sort()将在原数组上对数组元素进行排序,即排序时不创建新的数组副本。如果调用方法sort()时没有使用参数,将按字母顺序(更为精确地说,是按照字符编码的顺序)对数组中的元素进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如果有必要的话),以便进行比较。

    如果想按照别的顺序进行排序,就必须提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数a和b,其返回值如下:

    如果根据你的评判标准,a小于b,在排序后的数组中a应该出现在b之前,就返回一个小于0的值。

    如果a等于b,就返回0。

    如果a大于b,就返回一个大于0的值。

    注意,数组中undefined的元素都排列在数组末尾。即使你提供了自定义的排序函数也是这样,因为undefined值不会被传递给你提供的orderfunc。

    示例

    下面的代码展示了如何编写按数字顺序,而不是按字母顺序对数组进行排序的比较函数:

    // 按照数字顺序排序的排序函数
    
    function numberorder(a, b) { return a - b; }
    
    a = new Array(33, 4, 1111, 222);
    
    a.sort(  );             // 按照字母顺序的排序结果为: 1111, 222, 33, 4
    
    a.sort(numberorder);    // 按照数字顺序的排序结果为: 4, 33, 222, 1111
    

    试验

    //坑1:排序后,影响本身(而非生成新数组) 
    //坑2:默认情况下sort方法是按ascii字母顺序排序的,而非我们认为是按数字大小排序
      var arr5=[100,19,52,502];
      arr5.sort();                 
      console.log(arr5);     //arr5:[100, 19, 502, 52]  
    
    //用法3:改变默认比较数字大小来排序    加入function(a,b){return a-b}
    
    //疑问4:a,b   代表.. arguments[0]和arguments[1]//
    function compare2Val(a,b){return a-b}
    var arr6=[100,19,52,502];
    arr6.sort(compare2Val); //调用 不需要传参,
     console.log(arr6); //arr6: [19, 52, 100, 502]
    
    //调用 不需要传参的本质
     function compare2Argument(){return arguments[0]-arguments[1]}
     var arr7=[100,19,52,502];
    arr7.sort(compare2Argument); //[19, 52, 100, 502]
     console.log(arr7); //arr6: [19, 52, 100, 502]
    
    
    
    /*************总比较次数结论**************/
    //疑问5 总比较次数:n(n-1)/2  n为数组长度
    
    //答:1:各轮比较次数 的和 
    //答:2: (数组长度-1+数组长度-2+数组长度-3......+1)  
    
    /*
    例数组长度6  比较次数:5+4+3+2+1=15    
    例数组长度5   比较次数:4+3+2+1=10    
    例数组长度4   比较次数:3+2+1=6    
    
    //高中学的1+2+3+.....+n=?
    答案:
    设S=1+2+…+(n-1)+n,
    则S=n+(n-1)+…+2+1
    ∴2S=(1+n)+[2+(n-1)]+…+[(n-1)+2]+(n+1)
    =n(n+1)
    ∴S= n(n+1)/2,
    即1+2+…+(n-1)+n= n(n+1)/2.
    */
    
    //比较轮数:数组长度-1     每轮比较产生一个最大值放在数组最右,这个最大值不参与下轮比较
    //当前轮比较次数:数组长度-当前轮数  
    /*************结论**************/
    
    //轮数4()-1  3轮
    //第一轮:4-1比较3次    [19,100,52,502]; [19,52,100,502];  [19,52,100,502];  做3次比较
    //第二轮:4-2 比较2次   抛弃502,--->[19,52,100,502];  [19,52,100,502];  只做19 52    ,52 100的2次比较
    //第三轮:4-3 比较1次   抛弃100,502--->[19,52,100,502];  只做19 52  的1次比较
    
    
    
    
    //5,开发中常用方式  
    //例:根据人的年龄排序
    function person(name,age){
    	this.Name=name;
    	this.Age=age
    }
    var  personArray=[];
    personArray.push(new person("LiKe",18));
    personArray.push(new person("Tom",58));
    personArray.push(new person("Lucy",22));
    personArray.push(new person("Haimei",16));
    
    function compareAge(a,b){
    	return a.Age-b.Age;
    }
    personArray.sort(compareAge);
    console.log(personArray);//Haimei  LiKe  Lucy Tom  
    
  • 相关阅读:
    angularjs中的页面访问权限设置
    Html页面head标签元素的意义和应用场景
    脚本引用中的defer和async的用法和区别
    自适应页面中如何使用雪碧图
    网页颜色分辨测试小游戏的js化辨别及优化
    jQuery1.9及其以上版本中动态元素on绑定事件无效解决方案
    Data URL简介及Data URL的利弊
    浏览器调试:事件定位与源码查找
    简述ES5 ES6
    移动端中pagehide、pageshow的应用
  • 原文地址:https://www.cnblogs.com/leee/p/5552164.html
Copyright © 2011-2022 走看看