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
如果要查詢的數等於中間值,輸出
如果中間值大於要查詢的數,說明要查詢的數比中間值小,在中間值左邊,然後把中間值作為最大,繼續迴圈
如果中間值小於要查詢的數,說明要查詢的數比中間值大,在中間值右邊,然後把中間值作為最小,繼續迴圈
如果遇到還剩下兩個數的情況,這兩個值就一個大的是最大值,一個小的是最小值,取出的中間值因為在程式中去掉了分數,只留整數,所以中間值也就是最小值,這時判斷要查詢的數是否是中間值即最小值右邊的數即最大值,如果是,輸出