JavaScript數組示例
阿新 • • 發佈:2017-12-03
代碼 分法 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 vara = 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數組示例