看这段js的二分查找

JavaScript019

看这段js的二分查找,第1张

<!DOCTYPE HTML>

<html lang="en-US">

<head>

<meta charset="UTF-8">

<meta name="keywords" content="白菜编辑部">

<title>白菜编辑部</title>

<style type="text/css">

</style>

<script type="text/javascript">

function binarySearch0 (a, fromIndex, toIndex, key)

    {

    var low = fromIndex

    var high = toIndex - 1

    

    while (low <= high)

    {

    var mid = (low + high) >>> 1

    var midVal = a[mid]

    

    if (midVal < key)

    {

    low = mid + 1

    }

    else if (midVal > key)

    {

    high = mid - 1

    }

    else

    {

    return mid // key found

    }

    }

    return -(low + 1) // key not found.

    }

    

    function binarySearch (a, key)

    {

    return binarySearch0 (a, 0, a.length, key)

    }

    

    var arr = [

            1, 4, 6, 8, 9, 90, 800

    ]

    

    console.log (binarySearch (arr, 90))

</script>

</head>

<body>

</body>

</html>

二分查找算法,该算法要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。如果一个序列是无序的或者是链表,那么该序列就不能使用二分查找。

二分查找算法原理:若待查序列为空,则返回-1,并退出算法;若待查序列不为空,则将它的中间元素与目标数值进行比较,判断是否相等;若相等,则返回中间元素索引,并退出算法;此时已查找成功。若不相等,则比较中间元素与目标数值的大小。

若中间元素>目标数值,则将当前序列的前半部分作为新的待查序列;若中间元素<目标数值,则将当前序列的后半部分作为新的待查序列;在新的序列上重新从第(1)步开始查找。

二分法查找的思路:首先,从数组的中间元素开始搜索,如果该元素是目标元素,则搜索过程结束,否则执行下一步。如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。如果某一步数组为空,则表示找不到目标元素。

二分查找的一个技巧是:不要出现else,而是把所有情况用else,if写清楚,这样可以清楚地展现所有细节。本文都会使用else,if,旨在讲清楚,读者理解后可自行简化。

通过线性查找检索出现在视口内的元素,效率较低 比如 js寻找在视口内的元素-线性查找 对100个元素进行查找,需要循环100次,或者找到之后跳出循环。

通过二分查找改进,先找到一个出现在视口内的元素,再从它的上下查找。