**前言**
今天是堅持每天寫代碼的第三天,突然覺得堅持做一件事真的還挺難的,現在已是深夜,但是我還是想堅持寫點東西,告訴自己無論如何也要堅持去做一件事情,迫使自己養成一個主動總結自己知識結構的習慣。今天沒太多時間去寫比較復雜的小界面or小功能。所以就回顧下我們之前在學校學習數據結構時候學過的一些算法吧。今天重點來回顧下比較簡單的二分查找算法。
**二分查找算法:**
二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用于不經常變動而查找頻繁的有序列表。首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,如果兩者相等,則查找成功;否則利用中間位置記錄將表分成前、后兩個子表,如果中間位置記錄的關鍵字大于查找關鍵字,則進一步查找前一子表,否則進一步查找后一子表。重復以上過程,直到找到滿足條件的記錄,使查找成功,或直到子表不存在為止,此時查找不成功。
今天我就寫一個用javascript實現的二分查找算法。
~~~
//定義一個函數用于實現二分查找算法
function search_key(data_array,search){
var data_array_length = data_array.length;
var start = 0;
var end = data_array_length - 1;
var middle = 0;
while(start<=end){
middle = parseInt((start+end)/2);
if(data_array[middle]>search){
end = middle - 1;
}else if(data_array[middle]<search){
start = middle + 1;
}else{
return middle;
}
}
return -1; //不存在
}
//定義一個有序數組。意思就是我們的數組的元素是已將排好序的。
var data_arr = [23,34,48,60,68,80,98,120];
//我們要解決的問題是,比如我想找到data_arr這個數組中的60這個數值,是在數組的哪個位置。我該怎么快速的找到
//調用函數計算并找出 60所在的位置
var search = 60;
var result = search_key(data_arr,search);
if(result==-1){
alert("主人很抱歉,您找的元素不存在哦!!!");
}else{
alert("主人您要的元素找到了,所在的位置為:"+(result+1));
}
~~~
今天解決的問題就是如何在一個有序的列表中快速的找到我們想要找的元素。這個問題設定了限制條件 有序列表。二分查找的解決思路就是先去比較中間位置的元素是否跟我們要查找的元素相等,然后即可將查找的范圍鎖定到整個區間的一半,后續逐步縮減范圍,直到找到滿足條件的結果。所以效率還是挺高的。
這里我拋出一個問題,如果我們不用二分查找來實現,按照正常的思路你會怎么解決呢?或者說除了我這樣的寫法,您還有其他更好的實現么?這個問題留給大家,大家來思考如何解決,歡迎和我交流互動。