1、折半查找的原理
折半查找用於對排好序的數組進行查找。其原理是:從數組的中間元素開始,與要查找的元素進行比較,如果相等,則中間元素爲查找元素;如果大於中間元素,則在大於中間元素的那半部分數組中進行查找;如果小於中間元素,則在另一半數組中查找,如果沒有,則跳出查找過程,並返回提示信息。
2、實現
function binarySearch (arr) {
var len = arr.length;
if(len == 1) return arr[0];//數組中只有一個數,則返回當前值
// arr[0] * arr[len - 1] > 0 表示數組中的數全爲負數或者全爲整數
if(arr[0] * arr[len - 1] >= 0) {
if(arr[0] >= 0) {
return arr[0];
} else if(arr[len - 1] < 0) {
return arr[len - 1];
}
}
// arr[0] * arr[len - 1] < 0 表示數組中有正有負
if (arr[0] * arr[len - 1] < 0) {
var low = 0,
high = len -1,
mid = Math.floor((low + high) / 2);
var midValue = Math.abs(arr[mid]);
while (low <= high) {
if(midValue < Math.abs(arr[mid - 1]) && midValue < Math.abs(arr[mid + 1])) {
// 如果當前數值的絕對值比與他相鄰的兩個數據的絕對值都小,則該值爲絕對值最小的值。
return arr[mid];
} else {
if(midValue < Math.abs(arr[mid - 1]) && midValue > Math.abs(arr[mid + 1])) {
// 如果當前數值的絕對值小於左邊相鄰數據的絕對值,但是大於右邊相鄰數據的絕對值,則應該在右邊尋找最小值
low = mid + 1;
mid = Math.floor((low + high) / 2);
midValue = Math.abs(arr[mid]);
} else if (midValue > Math.abs(arr[mid - 1]) && midValue < Math.abs(arr[mid + 1])) {
// 如果當前數值的絕對值大於左邊相鄰數據的絕對值,但是小於右邊相鄰數據的絕對值,則應該在左邊尋找最小值
high = mid - 1;
mid = Math.floor((low + high) / 2);
midValue = Math.abs(arr[mid]);
}
}
}
}
}
var arr = [0, 4, 7, 10];
var minValue = binarySearch(arr);
console.log(minValue);