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);
        }

  

  

原文地址:https://www.cnblogs.com/zxbs12345/p/7966348.html