數組
一、冒泡排列
對數組attr = [1,8,6,4,5,3,7,2,9]進行由大到小排列,用冒泡排列的方法排列時,會對數組進行比較互換。如果前一個數字較大,這2個元素排列方式不變,如果后一個元素較大,則這2個元素互換位置。對比互換方式如下:
第一次 [8,6,4,5,3,7,2,9,1]
第二次 [8,6,4,5,3,7,9,2,1]
第三次 [8,6,5,4,7,9,3,2,1]
第四次 [8,6,5,7,9,4,3,2,1]
第五次 [8,6,7,9,5,4,3,2,1]
第六次 [8,7,9,6,5,4,3,2,1]
第七次 [8,9,7,6,5,4,3,2,1]
第八次 [9,8,7,6,5,4,3,2,1]
此數組的長度為9,元素進行了8次對比互換以后完成了數組由大到小的排列,排列的次數是attr.length-1。數組attr = [1,8,6,4,5,3,7,2,9]冒泡排列的代碼如下:
var attr = [1,8,6,4,5,3,7,2,9];//要進行冒泡排列的數組 var zj = 0;//定義一個交換使用的中間變量 for(var i = 0;i<attr.length-1;i++)//控制比較的輪數 { for(var j = 0;j<attr.length-1-i;j++)//控制每輪比較的次數 { if(attr[j]<attr[j+1])//如果下一個元素大於當前元素 { zj = attr[j];//把attr[j]的值給zj attr[j] = attr[j+1];//把attr[j+1]的值給attr[j] attr[j+1] = zj;//把zj的值再給attr[j+1] } } } alert(attr[0]);//輸出索引對應的元素的值,alert(attr[0]);輸出的元素就是9。
但是上面的元素排列的代碼存在一個缺點就是每次比較都會對所有的元素進行比較,而實際上不需要每次都比較所有的元素,比如第七次 [8,9,7,6,5,4,3,2,1],只需要比較前兩個元素就可以了,后面的元素已經是由大到小排列了,就沒有必要再比較了。由上面的數組比較互換方式上可以看出,第一次需要比較8次,第二次需要比較7此,直到第七次需要比較2次,第8次只需要比較1次。第i次比較的次數j正好是attr.length-1-i,所以上面代碼只需要改變j的值,第i輪比較的次數為for(var j = 0;j<attr.length-1-i;j++)。這樣就減少了很多的計算量。
對數組排列除了上面的冒泡排列法以外,還有一種如下:
attr.sort(); alert(attr[0]);
但是此種排列方法在JS中不可以用,因為這種方法只排列數字的第一位。在別的語言里可嘗試使用。
二、在數組里面查找數據
查找用戶給定的數的索引(出現在第幾個位置)。如果沒有,輸出一個提示,如果有,輸出該元素的索引。
var attr = [1,2,3,4,5,6,7,8,9];//數組 var v = 6;//要查找的值 var sy = -1;//先把索引定義成一個負數 for(var i =0;i<attr.length;i++)//控制查找的次數 { if(attr[i]==v)//條件判斷 { sy = i;//如果找到目標值,把i的值給sy } } if(sy == -1)// 如果沒找到目標值 { alert("沒有找到數據");//就輸出“沒有找到數據” } else//如果找到目標值
{
alert("該元素在數組里的索引為: "+sy);//輸出該目標元素的索引值
}
這種查找數據的方法運算量比較大,要把數組里面的每個元素都拿出來比較,知道找到目標元素。有一種可以減少運算量的方法叫做二分法,也可以查找數據,運算量也大大減少,提高運算效率。
二分法的原理就是把所有的元素分成2半。比如attr = [1,2,3,4,5,6,7,8,9];這組數組,最小的索引是0,最大的索引是8。把最大和最小索引取個平均值,索引是4,分成的2組數組就是0-4和5-8。看中間的索引,對應的元素是5,而目標值是6>5,索引0-4的數組就不需要考慮了,值考慮索引為5-8的數組。再取索引為5-8的平均值為6(取整數),數組的索引又分成了5-6和7-8。索引6對應的元素是7,目標值是6<7,所以索引7-8的數組就不需要考慮了。以此類推逐步減小目標值的范圍,找出目標值的索引。二分法具體的代碼如下:
var attr = [1,2,3,4,5,6,7,8,9];//數組 var v = 6;//要查找的值 var minsy = 0;//最小索引 var maxsy = attr.length-1;//最大索引 var midsy;//中間索引 while(true) { midsy = parseInt((minsy+maxsy)/2)// 計算中間索引,有可能出現小數,要把中間索引轉成整數。 { if(attr[midsy] == v)//比較中間值和用戶給定的值 { break; } if(midsy = minsy)//只剩2個值的情況下;例如只剩下7和8,求平均數以后是7,結果還是剩下7和8。 { if(attr[midsy]==v)//如果大的索引對應的元素和目標元素相等 { midsy = midsy+1;//中間索引+1后輸出索引 break;//終止循環 } else//如果大的索引對應的元素和目標元素不相等 { midsy = -1;//給中間索引賦值-1,意思就是數組里面沒有目標元素。 break;//終止循環 } } if(attr[midsy]>v)//如果中間索引對應的值>給定值,目標值在索引小的那一半里面。 { maxsy = midsy;//把中間索引值變成最大值 } else//中間索引對應的值<給定值,目標值在索引大的那一半里面。 { minsy == midsy; } } } alert(midsy);