1. 程式人生 > 其它 >JavaScript數字例子,二分法,氣泡排序

JavaScript數字例子,二分法,氣泡排序

先看一下兩個例子:

十個成績,求總分,最高分,最低分

    //輸入10個成績,求總分,最高,最低
    var arr=new Array(67,45,56,12,90,98,23,43,56,99,97);    
    var g=0;
    var d=arr[0];//定義最小開始時等於第一個數
    var z=0;
    for(var i=0;i<arr.length;i++){
        z=z+arr[i]; 
        if(arr[i]>g){   
            g=arr[i];        
        }if(arr[i]<=d){
            d=arr[i];  
        }
    }
    alert(z+","+g+","+d);

首先定義出陣列,最高分g,最低分d開始時等於陣列第一個元素,總分z

然後迴圈中,首先總分加陣列元素

然後判斷這個陣列元素是否大於最高分,如果是則將這個分數賦給g,如果不是則判斷是否小於最低分d,如果是則將此值賦給d

最低分的要點在於開始賦值,如果和總分高分一樣初始值為0,則第二個判斷中,低分會一直為0,所以要把陣列的第一個值賦給d,這樣才能判斷計算

向陣列中新增資料時去重

    var arr=Array(2,1,11,2,31);
    var s=prompt("請輸入學號");
    var z=0;
    for(var i=0;i<arr.length;i++){
        if(s==arr[i]){
            z=1;
        }
    }
    if(z==0){
        arr.push(s);    
    }else{
        alert("重複");
    }
    alert(arr);

首先定義陣列,輸入學號的返回值s,變數z

遍歷陣列中,判斷如果輸入的值等於陣列中的某個數,將z的值變為1,然後在進行判斷,如果z為0,說明輸入的陣列中沒有,寫入,否則,提示重複

我們還可以直接呼叫arr.indexOf()方法來進行查詢

arr.indexOf()方法:給他一個值,如果這個值在陣列中出現,返回這個值得索引,如果不存在,返回 -1

//    2.往數組裡面新增資料的時候去重
    var a = parseInt(prompt("請輸入一個數字:"));
    var arr = new Array(1,2,3,4,5);
    
    alert(arr.indexOf(a)); //判斷資料是否在數組裡面存在

輸入值5,返回5的索引4。

需要注意在這裡要用 parseInt() 將輸入的值轉換為整數。

 氣泡排序

將一組無規律的資料按照一定的規律排列下來

氣泡排序的原理:

這是將一組無規律的資料從大到小排列

由此可知氣泡排序的規律:

比較的輪次=陣列長度-1

每輪比較的次數=陣列長度-輪次

    //氣泡排序
    var arr=new Array(12,32,54,65,45,23,09,67,91);
    var zj=0;
    for(i=1;i<arr.length;i++){
        for(l=0;l<arr.length-i;l++){
            if(arr[l]<arr[l+1]){
                zj=arr[l];
                arr[l]=arr[l+1];
                arr[l+1]=zj;
            }
        }
    
    }
    alert(arr[0]+","+arr[1]+","+arr[2]+","+arr[3]+","+arr[4]+","+arr[5]+","+arr[6]+","+arr[7]+","+arr[8]);

這裡的思路是:

首先定義出陣列,在定義一箇中間變數zj

然後一個for迴圈控制比較的輪次,所以這裡i從1開始,迴圈中i<1也就是迴圈的輪次是陣列長度-1,然後裡面在巢狀一個for迴圈控制每一輪比較的次數,這裡l=0,l小於陣列長度減去i也就是輪數。

當然,以上是執行次數最少的方案,如果不考慮執行效率,可以i,l初始值都為0,並且都小於陣列長度,其結果是一樣的。

二分法

在數組裡查詢資料,找到資料所在的索引

//    在數組裡面查詢資料,找到資料所在位置的索引
    var arr = new Array(1,2,3,4,5,6,7,8,9,10);
    var a = 2;
    //方法一
    alert(arr.indexOf(a));
    //方法二
    for(var i=0;i<arr.length;i++){
        if(a==arr[i]){
            alert(i);
        }
    }
//    二分法查詢資料,陣列必須是排好序的
    var minx = 0;      //定義最小值
    var maxx = arr.length-1;      //定義最大值
    while(true){      //不確定迴圈次數,使用while玄幻
        //定義中間值等於最大值和最小值和的一半
        var zjx = parseInt((minx+maxx)/2);      
        if(zjx==minx){      //中間值等於最小值的情況下
            if(a==arr[zjx+1]){      
                alert(zjx+1);      //如果要查詢的資料等於中間值+1,也就是中間值右邊得數,輸出值,跳出迴圈
                break;      
            }
        }
        if(a==arr[zjx]){      
            alert(zjx);      //如果中間值等於要查詢的數,輸出
            break;      
        }else if(a>arr[zjx]){      //如果中間值大於要查詢的數
            minx = zjx;      //中間值賦給最小值,然後繼續迴圈
        }else{
            maxx = zjx;      //如果中間值小於要查詢的數,中間值賦給最大值,然後繼續迴圈
        }    
    }

這三種方法都可以找到資料的索引,這裡著重看一下二分法

二分法查詢的前提;陣列必須為有序

思路:找到陣列的中間數zjx和要查詢的數a,若a<zjx,則要查詢的數在中間數zjx的左邊,就把陣列二分,只在左邊查詢,右邊同理,直到找到要查詢的數。

二分法對於資料特別多的情況能極大的節約效率。

在上面的二分法中:

首先定義最大值  maxx,最小值  minx

中間值  zjx 也可以再迴圈中定義

我們不能確定迴圈的次數,所以這裡使用  while  迴圈

首先找出中間值,中間值等於最大值和最小值的和除以2

如果要查詢的數等於中間值,輸出

如果中間值大於要查詢的數,說明要查詢的數比中間值小,在中間值左邊,然後把中間值作為最大,繼續迴圈

如果中間值小於要查詢的數,說明要查詢的數比中間值大,在中間值右邊,然後把中間值作為最小,繼續迴圈

如果遇到還剩下兩個數的情況,這兩個值就一個大的是最大值,一個小的是最小值,取出的中間值因為在程式中去掉了分數,只留整數,所以中間值也就是最小值,這時判斷要查詢的數是否是中間值即最小值右邊的數即最大值,如果是,輸出