二分查找(JavaScript实现)

用数组来实现这个算法,前提是先将数组升序排序。

思路:

数组索引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

猜你喜欢

转载自blog.csdn.net/q411020382/article/details/80356215
今日推荐