用数组来实现这个算法,前提是先将数组升序排序。
思路:
数组索引0设为起点start,最后一个元素设为end,把要查找的值和数组中间的值对比,如果要查找的值比中间的值要大,则将数组中间的索引设为start,然后再取start和end的中间值,一直对比直到找到所要找到的值,或没有这个值为止。
举例:
1-10的数组 我要查找7 先查5 发现7比5大 再查5和10的中间值 7 查到了
1-10的数组 我要查找3 先查5 发现3比5小 再查1和5的中间值 3 查到了
算法实现
/**
* [二分查找算法实现]
* @param {array}
* @param {number} val [value]
* @return {number} [index]
*/
function binarySearch(arry, val) {
let start = 0
let end = arry.length - 1
while (start <= end) {
let mid = start + Math.floor((end - start) / 2)
if (arry[mid] < val) {
start = mid + 1
} else if (arry[mid] > val) {
end = mid - 1
} else {
return mid
}
}
return -1
}
module.exports = binarySearch
测试函数
const binarySearch = require('./binary_search.js')
/**
* [循环查找]
* @param {array}
* @param {number} val [value]
* @return {number} [index]
*/
function loopSearch(arry, val) {
let len = arry.length
for (let i = 0; i < len; i++) {
if (arry[i] === val) {
return i
}
}
return -1
}
/**
* [创建随机数组]
* @param {number}
* @param {number}
* @return {array}
*/
function createData(len, limit) {
const arry = []
let temp = 0
for (let i = 0; i < len; i++) {
do {
temp = Math.floor(Math.random() * limit)
}
while (arry.indexOf(temp) !== -1)
arry.push(temp)
}
return arry
}
/**
* [测试函数]
* @param {number} limit [生成值的上限]
* @param {number} num [被查找的目标数组]
* @param {number} num2 [数组里的值是要查找的值,NUM是指数组包含多少个这样的值]
* @return {none}
*/
function test(limit, num1, num2) {
if (num1 > limit) {
console.log('生成数数量不能大于上限值')
return
}
const arry1 = createData(num1, limit).sort((a, b) => a - b)
const arry2 = createData(num2, limit)
let t1 = new Date()
arry2.forEach(e => {
binarySearch(arry1, e)
})
let t2 = new Date()
console.log((t2 - t1) / 1000 + 's')
let t3 = new Date()
arry2.forEach(e => {
loopSearch(arry1, e)
})
let t4 = new Date()
console.log((t4 - t3) / 1000 + 's')
}
test(1000000, 100000, 100000)
第一个代码保存为binary_search.js
第二个代码保存为test.js
然后用NODE运行
node test.js