二分法查找的必要条件:数据必须是一个有序的列表
概述:利用每次都先找到中间值然后排除一半数据的方法进行查找
js实现1
思路:获得数组左右两侧的下标left/right,将(left+right)/2获得mid下标,根据大小关系修改left,right值
function findNum(nums, que) {
let leftIndex = 0;
let rightIndex = nums.length - 1;
let ret = -1;//定义返回结果
while (leftIndex !== rightIndex) {
let mid = Math.round((leftIndex + rightIndex) / 2)
if (nums[mid] === que) {
ret = mid
break;
} else if (nums[mid] > que) {
rightIndex = mid
} else {
leftIndex = mid
}
}
return ret
}
let nums = [1, 3, 6, 8, 11, 22, 88] //目标数组
const que = 6;//目标结果
const result = findNum(nums, que)
if (result !== -1) {
console.log(`找到了:下标是${result}`)
} else {
console.log('可惜,没找到')
}
js实现2【用的计数下标,思路繁琐】:
思路:创建一个变量queIndex保存结果下标数字,每次获得数组的长度除以2得到mid值,mid值比结果值小则queIndex加上mid值,一直找到结果为止
let nums = [1, 3, 6, 8, 11, 22, 35, 73, 99, 101, 202, 305, 606, 1000, 10001, 20300] //目标数组
const que = 20300;//目标结果
let queIndex = 0;//跟踪目标结果下标
let fin_n = 0;//查找次数
while (nums.length !== 1) {
fin_n++;
const mid_index = Math.round(nums.length / 2)
//找中间值
const middle = nums[mid_index]
//判断 比que大还是小,生成新的数组
if (middle > que) {
console.log('大了')
nums = nums.slice(0, mid_index)
} else if (middle < que) {
console.log('小了')
queIndex += mid_index
nums = nums.slice(mid_index)
} else {
//找到了
console.log(`找到了!:下标是:${queIndex + mid_index},总共查找了${fin_n}次`)
break;
}
}
if (nums.length === 1)
console.log(`找到了!:下标是:${queIndex},总共查找了${fin_n}次`)