二分查找就是每次都找中間數,然后跟要查找的數對比。
比如有這樣一個數組:
var s = [1,2,3,4,5,6,7,8,9,10,104,234]; (排過序的)
你要從中間找到104的下標,怎么辦?
我們寫一個函數:
function BinarySearch(s,x){ ??
?//s為待查找數組,x為要查找的數
? ? ? ?var a = 0;
? ? ? ?var b = s.length-1;
? ? ? ?while(a<=b){ ?只要最小數不大于最大數,就一直執行(好像是廢話)
? ? ? ? ? ? ? ? var middle = parseInt((a+b)/2); ? //取數組中間下標
? ? ? ? ? ? ? ? if (x == s[middle]) {
? ? ? ? ? ? ? ? ? ? ? ?return middle; ?//找到了,返回結果
? ? ? ? ? ? ? ? }else if(x < s[middle]){
? ? ? ? ? ? ? ? ? ? ? b = middle-1; ? ? //沒找到,將中間值作為最大值,繼續執行
? ? ? ? ? ? ? ?}else{
? ? ? ? ? ? ? ? ? ? ? a = middle + 1; ? //沒找到,將中間值作為最小值,繼續執行
? ? ? ? ? ? ? }
? ? ? }
? ? ? return -1; ?//數組里沒有這個數,返回-1;
}
我們要找到104在數組s里所對應的下標,就只需要調用函數
var? res = BinarySearch(s,104);
學習了二分法,來個實例:還是剛剛那個數組:
var s = [1,2,3,4,5,6,7,8,9,10,104,234];
要從里面找到2個數,要求他們的相加等于110,怎么做?
先說思想,二分法是找一個數,題目要求是找二個數,怎么辦?我們要把問題轉化到找一個數上,遍歷數組s,每次遍歷的時候得到其中一個數s[i],然后去找另外一個數,我們要找相加等于110的數,那另外一個數其實就等于110-s[i],說到這里是不是已經明白了?
沒明白不要緊,貼代碼,請看下面這個函數:
function searchTwoNum(s,x){ //傳數組s 和 兩個數之和x
? ? var dic;
? ? for(var i = 0; i < s.length;i++){
? ? ? ? var a = s[i]; ? //假設它是其中一個數
? ? ? ? var b = x - s[i]; ?//假設a的假設成立,那b就是另一個數
? ? ? ? var n = BinarySearch(s,b); //判斷是不是有b,有的話就說明a的假設成立了
? ? ? ? if (n != -1) { //上面說了n==-1的時候實際上就是沒找到,所以不等于-1時就找到了
? ? ? ? ? ? dic = {i:i,n:n,a:a,b:b};
? ? ? ? ? ? break; //找到了就不找了,跳出去
? ? ? ? }
? ? }
? ? return dic;
}
調用該函數,就可以找到要找的數:
var dic = searchTwoNum(s,110);
console.log(dic);