二分查找:是一種搜索某個值的索引的算法。
基本條件:有序的數組。
思路:1.將數組折半,分成左右兩個數組。
2.判斷要查找的數和中間位置數值的大小,來判斷要查找的數實在哪一半。
3.之后繼續折半查找,直至找到這個數。
方法:二分查找有兩種方法,一種是非遞歸方式,采用while方式,判斷是否符合要求。另一種是采用遞歸方式,采用if方式,依次遞歸,找到相應的值。
步驟一(非遞歸):
/**
*
* @param {*} arr 已排好的數組
* @param {*} key 想要查找的值
*/
function binary_search(arr, key) { var low = 0, high = arr.length - 1; while (low <= high) { var mid = parseInt((high + low) / 2); if (key == arr[mid]) { return mid; } else if (key > arr[mid]) { low = mid + 1; } else if (key < arr[mid]) { high = mid - 1; } else { return -1; } } }
步驟二 (遞歸):
/**
*
* @param {*} arr 已排好的數組
* @param {*} low 第一個值的索引
* @param {*} high 最后一個值的索引
* @param {*} key 想要查找的值
*/
function binary_search(arr,low,high,key){
if (low > high) {
return -1;
}
var mid = parseInt((high + low) / 2);
if (arr[mid] == key) {
return mid;
} else if (arr[mid] > key) {
high = mid - 1;
return binary_search(arr, low, high, key);
} else if (arr[mid] < key) {
low = mid + 1;
return binary_search(arr, low, high, key);
}
}
時間復雜度:總共有n個元素,漸漸跟下去就是n,n/2,n/4,....n/2^k,其中k就是循環的次數,由於你n/2^k取整后>=1,即令n/2^k=1,可得k=log2n,(是以2為底,n的對數)
O(log2n) => O(logn)
優點:比較次數少,查找速度快,平均性能好。
缺點:要求待查表為有序表,且插入刪除困難。
結論:適用於不經常變動而查找頻繁的有序列表。