• JavaScript数组示例


    向数组添加新元素时去重复

      1.一般的思路与原理

        var a =[3,5,8,9,2,10,4] ;//原始数组
        var x =4 ;//新数据
        var cf = false ;//设定一个判断是否重复的值
        for(var i=0;i<a.length;i++)//循环遍历
        {
            if(a[i]==x)//数据重复
            {
                cf=true;//改变设定变量的值
            }
        }
        if(cf==true)//数据重复执行的代码
        {
            alert("该数据已存在");
        }
        else//数据没有重复
        {
            a.push(x);//添加到数组中
        }
        

      2.更简便的方法,indexOf( ) 可以返回相应数据在对应数组中的索引号,如果数组中没有改数据,则会返回-1,

        所以可以用 indexOf( ) 来判断数据是否重复,

        

        var a =[3,5,8,9,2,10,4] ;//原始数组
        var x =4 ;//新数据
        var b = a.indexOf(x);//定义变量b来接收indexOf()的返回值
        if(b==-1)//返回值为-1,数组中没有该数据
        {
            a.push(x);//把数据添加到数组中
        }
        else//返回值不为-1就说明数组中有该数据
        {
            alert("该数据已存在");//数据重复执行的代码
        }

    冒泡排序

      将一个无序的无重复数组按照从大到小或从小到大的顺序重新排列,这里按照从大到小的顺序分析,原理是依次比较每两个数据的大小,把小的值往后放,即如果前一个数据小于后一个数据,则交换,如果前一个数据大于后一个数据,则不变

      首先定义一个原始数组

        var attr = [4,7,3,6,8,1,2,9,5];//原始数组

      第一个数据和第二个数据的比较和交换

        var i = 0 ;//索引为0
        var a = attr[i]<attr[i+1];//比较第一个和第二个数据
        if(a==true)//如果第一个数据小于第二个数据
        {
            //交换
            var b = attr[i];//设定一个中间变量b用来接收第一个数据的值
            attr[i] = attr[i+1];//第一个数据变为较大值
            attr[i+1] = b;//第二个数据变为较小值
        }

      如果要比较到底就要用for循环

        for(var i=0;i<attr.length-1;i++)//两两比较的次数为数组的长度减一
        {
            if(attr[i]<attr[i+1])//如果前一个数据小于后一个数据
            {
                //交换
                var b = attr[i];//设定一个中间变量b用来接收第一个数据的值
                attr[i] = attr[i+1];//第一个数据变为较大值
                attr[i+1] = b;//第二个数据变为较小值
            }
            //如果前一数据大于后一数据则无变化
        }

      输出数组发现最小值排到了最下面,按照这样最多8个轮次就可以把数据从大到小排列完毕,所以可以在外层套用一个循环来控制比较的轮次,而且轮次越往后,每轮的两两比较次数会越少,因为最小的值已经依次排好了,排好的数据个数(x)正好是轮次数(j)减一,两两比较的次数(z)是未排好的数据个数(y)减一,并且数据的总个数是length,所以 x+y=length;x=j-1;z=y-1 ==>y=z+1;==> (j-1)+(z+1)=length;==> z=length-j ,最终可以写为:

        for(var j=1;j<attr.length;j++)//控制比较的轮次,从1开始所以有attr.length-1轮
        {
            for(var i=0;i<attr.length-j;i++)//两两比较的次数为数组的长度减轮次
            {
                if(attr[i]<attr[i+1])//如果前一个数据小于后一个数据
                {
                    //交换
                    var b = attr[i];//设定一个中间变量b用来接收第一个数据的值
                    attr[i] = attr[i+1];//第一个数据变为较大值
                    attr[i+1] = b;//第二个数据变为较小值
                }
                //如果前一数据大于后一数据则无变化
            }
        }

      输出为

       如果想从小到大排序,只要把条件改为当前一数据大于后一数据时交换就可以了,即把 if 中的小于号改为大于号。

     数据排序的简便方法

      sort( )方法,默认按数据首位数字的值升序排序,可以加一个排序函数来达到按数值升序排序

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

    二分法查找数据

      二分法适用于有序排列的数组,原理是索引取中进行判断,逐步二分舍弃缩小比较范围,最终找到数据的索引值,优点是比较次数少,在大数据查找时可以节省计算机资源

        var attr =[1,2,3,4,5,6,7,8,9,10];//原始数组
        var sr =11;//需要查找的数据
        var minxl =0;//最小索引
        var maxxl =attr.length-1;//最大索引
        var midxl =0;//取中索引
        while(true)
        {
            //索引取中
            midxl=parseInt((minxl+maxxl)/2)
            //判断是否是需要找的索引号
            if(attr[midxl]==sr)
            {
                break;//是,找到并退出循环
                }
            //判断是否只剩两个值
            if(minxl==midxl)
            {
                //判断最末索引是否是需要的索引号
                if(attr[midxl+1]==sr)
                {
                    //是,找到并退出循环
                    midxl=midxl+1
                    break;
                        }
                else
                {    //不是,没有合适的值,退出循环
                    midxl=-1;//赋予一个不可能是索引的值
                    break;
                    }
                }
            //更改检索的范围,即二分
            if(attr[midxl]<sr)
            {
                minxl=midxl;
                }
            else
            {
                maxxl=midxl;
                }    
            }
        if(midxl==-1)
        {
            alert("没有该数据");
                }
        else
        {
            alert("该数据序列号为"+midxl);
            }

      

      

  • 相关阅读:
    Consul注销实例
    sql优化基础篇
    linux下执行java类(运行java定时器)
    ExecutorService 的理解与使用
    精度计算的方法
    内部类详解
    接口的作用
    面向对象之继承和组合浅谈
    构造器前篇
    教师编制考试数据分析
  • 原文地址:https://www.cnblogs.com/zxbs12345/p/7966348.html
Copyright © 2020-2023  润新知