思路
1.从一组有序元素中间开始查找,如果中间元素刚好和目标元素相等,则查找结束。
2.如果中间元素大于目标元素,则说明目标元素在数组左侧区域;如果中间元素小于目标元素,则说明目标元素在数组右侧区域。重复第一部操作,直至找到目标元素。
3.如果找不到目标元素,则返回-1。
实现
//递归算法
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9 ];
function binarySearch(arr, item, startIndex, endIndex) {
let searchIndex = -1;
let middleIndex = Math.floor((startIndex + endIndex) / 2);
if (startIndex >= endIndex) {
return searchIndex;
}
// 如果找到了,返回这一项的索引
if (arr[middleIndex] === item) {
searchIndex = middleIndex;
return searchIndex;
}
if (arr[middleIndex] > item) {
return binarySearch(arr, item, startIndex, middleIndex - 1)
} else {
return binarySearch(arr, item, middleIndex + 1, endIndex)
}
}
// 非递归算法
function binarySearch(arr, item) {
let startIndex = 0;
let endIndex = arr.length - 1;
while (startIndex <= endIndex) {
let middleIndex = Math.floor((startIndex + endIndex) / 2);
if (arr[middleIndex] === item) {
return middleIndex;
} else if (arr[middleIndex] > item) {
endIndex = middleIndex - 1;
} else if (arr[middleIndex] < item) {
startIndex = middleIndex + 1;
} else {
return -1;
}
}
}