javascript
9月19日下午JavaScript数组冒泡排列和二分法
數(shù)組
一、冒泡排列
? ? ? 對數(shù)組attr = [1,8,6,4,5,3,7,2,9]進行由大到小排列,用冒泡排列的方法排列時,會對數(shù)組進行比較互換。如果前一個數(shù)字較大,這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]?
? ? 此數(shù)組的長度為9,元素進行了8次對比互換以后完成了數(shù)組由大到小的排列,排列的次數(shù)是attr.length-1。數(shù)組attr = [1,8,6,4,5,3,7,2,9]冒泡排列的代碼如下:
var attr = [1,8,6,4,5,3,7,2,9];//要進行冒泡排列的數(shù)組 var zj = 0;//定義一個交換使用的中間變量 for(var i = 0;i<attr.length-1;i++)//控制比較的輪數(shù) {for(var j = 0;j<attr.length-1-i;j++)//控制每輪比較的次數(shù) {if(attr[j]<attr[j+1])//如果下一個元素大于當前元素 {zj = attr[j];//把attr[j]的值給zjattr[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],只需要比較前兩個元素就可以了,后面的元素已經(jīng)是由大到小排列了,就沒有必要再比較了。由上面的數(shù)組比較互換方式上可以看出,第一次需要比較8次,第二次需要比較7此,直到第七次需要比較2次,第8次只需要比較1次。第i次比較的次數(shù)j正好是attr.length-1-i,所以上面代碼只需要改變j的值,第i輪比較的次數(shù)為for(var j = 0;j<attr.length-1-i;j++)。這樣就減少了很多的計算量。
? ? ? 對數(shù)組排列除了上面的冒泡排列法以外,還有一種如下:
attr.sort(); alert(attr[0]);? 但是此種排列方法在JS中不可以用,因為這種方法只排列數(shù)字的第一位。在別的語言里可嘗試使用。
二、在數(shù)組里面查找數(shù)據(jù)
? ? ? 查找用戶給定的數(shù)的索引(出現(xiàn)在第幾個位置)。如果沒有,輸出一個提示,如果有,輸出該元素的索引。
var attr = [1,2,3,4,5,6,7,8,9];//數(shù)組 var v = 6;//要查找的值 var sy = -1;//先把索引定義成一個負數(shù) for(var i =0;i<attr.length;i++)//控制查找的次數(shù) {if(attr[i]==v)//條件判斷 {sy = i;//如果找到目標值,把i的值給sy } } if(sy == -1)// 如果沒找到目標值 {alert("沒有找到數(shù)據(jù)");//就輸出“沒有找到數(shù)據(jù)” } else//如果找到目標值 alert("該元素在數(shù)組里的索引為: "+sy);//輸出該目標元素的索引值這種查找數(shù)據(jù)的方法運算量比較大,要把數(shù)組里面的每個元素都拿出來比較,知道找到目標元素。有一種可以減少運算量的方法叫做二分法,也可以查找數(shù)據(jù),運算量也大大減少,提高運算效率。
? ? ?二分法的原理就是把所有的元素分成2半。比如attr = [1,2,3,4,5,6,7,8,9];這組數(shù)組,最小的索引是0,最大的索引是8。把最大和最小索引取個平均值,索引是4,分成的2組數(shù)組就是0-4和5-8。看中間的索引,對應的元素是5,而目標值是6>5,索引0-4的數(shù)組就不需要考慮了,值考慮索引為5-8的數(shù)組。再取索引為5-8的平均值為6(取整數(shù)),數(shù)組的索引又分成了5-6和7-8。索引6對應的元素是7,目標值是6<7,所以索引7-8的數(shù)組就不需要考慮了。以此類推逐步減小目標值的范圍,找出目標值的索引。二分法具體的代碼如下:
var attr = [1,2,3,4,5,6,7,8,9];//數(shù)組 var v = 6;//要查找的值 var minsy = 0;//最小索引 var maxsy = attr.length-1;//最大索引 var midsy;//中間索引 while(true) {midsy = parseInt((minsy+maxsy)/2)// 計算中間索引,有可能出現(xiàn)小數(shù),要把中間索引轉(zhuǎn)成整數(shù)。{if(attr[midsy] == v)//比較中間值和用戶給定的值 {break;}if(midsy = minsy)//只剩2個值的情況下;例如只剩下7和8,求平均數(shù)以后是7,結(jié)果還是剩下7和8。 { if(attr[midsy]==v)//如果大的索引對應的元素和目標元素相等 {midsy = midsy+1;//中間索引+1后輸出索引 break;//終止循環(huán) }else//如果大的索引對應的元素和目標元素不相等 {midsy = -1;//給中間索引賦值-1,意思就是數(shù)組里面沒有目標元素。break;//終止循環(huán) }}if(attr[midsy]>v)//如果中間索引對應的值>給定值,目標值在索引小的那一半里面。 {maxsy = midsy;//把中間索引值變成最大值 }else//中間索引對應的值<給定值,目標值在索引大的那一半里面。 {minsy == midsy;}} } alert(midsy);?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaofox0018/p/5885850.html
總結(jié)
以上是生活随笔為你收集整理的9月19日下午JavaScript数组冒泡排列和二分法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Object:
- 下一篇: JavaScript区分click事件和