二分查找虽然性能比较优秀,但应用场景也比较有限。底层必须依赖数组,并且还要求数据是有序的。对于较小规模的数据查找,我们直接使用顺序遍历就可以了,二分查找的优势并不明显。二分查找更适合处理静态数据,也就是没有频繁的数据插入、删除操作。
时间复杂度是 O(logn),分治思想
你需要着重掌握它的三个容易出错的地方:循环退出条件、mid 的取值,low 和 high 的更新
查找第一个值等于给定值的元素
const search = (arr, target) => {
// 没有数组数据,直接return -1
if (arr.lenght == 0) return -1;
// 声明两个指针分别指向头和尾(low,high)
let low = 0
let high = arr.length - 1
while (low <= high) {
// 取中间值
const mid = Math.floor((low + high) / 2)
if (arr[mid] == target) {
if (mid == 0 || target !== arr[mid - 1]) {
return mid;
} else {
high = mid - 1
}
} else if (target < arr[mid]) { high = mid - 1 } else {
low = mid + 1
}
return -1;
}
console.log(search([2,8,8,5,6,5],8))
查找重复数据的最后一个元素
const search = (arr, target) => {
// 没有数组数据,直接return -1
if (arr.lenght == 0) return -1;
// 声明两个指针分别指向头和尾(low,high)
let low = 0
let high = arr.length - 1
while (low <= high) {
// 取中间值
const mid = Math.floor((low + high) / 2)
if (arr[mid] == target) {
if (mid == arr.length - 1 || target !== arr[mid + 1]) {
return mid;
} else {
low = mid + 1
}
} else if (target < arr[mid]) { high = mid - 1 } else {
low = mid + 1
}
return -1;
}
console.log(search([2,8,8,5,6,5],8))