1. 程式人生 > >JavaScript數組示例

JavaScript數組示例

代碼 分法 else length cnblogs java rip 冒泡排序 數據

向數組添加新元素時去重復

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

  

  

JavaScript數組示例