【javascript算法】二分查找法

目录

1.二分查找算法

1.1定义 

1.2流程图

1.3查找过程

2.javascript的实现

2.1 源码

2.2测试结果

2.3拓展题


1.二分查找算法

本文是根据有序数组升序的顺序来实现的

1.1定义 

  二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

1.2流程图

【javascript算法】二分查找法_第1张图片

*为什么是 left <= right  ?

  因为始终要保证查找的对象内至少含有一个元素,且确保能判断对于left和right指向同一个元素的情况。

*为什么是left=middle +1 || right=middle -1 ?

  因为在第一次判断的时候就已经排除了middle = find 的这个可能,为了提升效率。可以直接将middle值减去不再第二次判断的序列之中

1.3查找过程

  首先,我们需要明确的一个问题就是:二分查找是一个效率较高的算法,但是这是相对于有序的数组来说。接下来就用图解的方法给大家解释一下二分查找算法的查找过程:

// 首先声明定义我们需要的变量

let array = new Array(); // 一个有序数组
let left = 0; // 数组的左端点
let right = array.length - 1; // 数组的右端点
let find; // 我们需要查找的数
let middle; // 数组的中间数 

  定义的数组:

开始查找:

  第一次查找:

【javascript算法】二分查找法_第2张图片

  可见第一次查找的 middle 是大于 find 的,那么可以确定第二次查找的目标序列和改变的端点。如下图所示:

【javascript算法】二分查找法_第3张图片

  第二次查找:

【javascript算法】二分查找法_第4张图片

  第三次查找:

【javascript算法】二分查找法_第5张图片

  经过第三次的查找之后,可见middle的就恰好是我们所要找的find。

  由以上过程可见,二分查找的效率是比较高的。每次对有序数组查找的过程都可以排除一半的可能性。

2.javascript的实现

2.1 源码

        window.onload = function () {
                let array = [1, 2, 3, 4, 5, 6, 7, 8, 9]  // 定义有序数组
                let find = +prompt("输入你要查找的元素:"); // 接收用户需要查找的数组 并将其转换为整数
                let left = 0; // 左端点的值
                let right = array.length - 1; // 右端点的值
                let count = 0; // 用于计次

                // 确保数组内含有至少一个元素
                while (left <= right) {
                    // 中间值的计算
                    // js需要用 Math.floor() 方法将所得的数做一个取整计算
                    let mid = Math.floor((left + right) / 2);

                    // 此处做一个对输入的判断 如果输入的数要大于最大值或者小于最小值,那么查找的数就不再这个数组中
                    if (find > array[right] || find < array[left]) {
                        alert("抱歉你要找的数不在这个数组中")
                        break;
                    }

                    count++;
                    if (array[mid] == find) {
                        // 如果相等,直接输出次数
                        alert("该数在这个数组中,查找了" + count + "次");
                        return 0;
                    } else if (array[mid] > find) {
                        // 如果中间值大于左边的值 改变右端点
                        right = mid - 1;
                    } else {
                        // 如果中间值大于右边的值 改变左端点
                        left = mid + 1;
                    }

                }
            }

2.2测试结果

  输入3:

【javascript算法】二分查找法_第6张图片

 输出结果:

【javascript算法】二分查找法_第7张图片

  错误输入判断:

  输入15

【javascript算法】二分查找法_第8张图片

  判断

【javascript算法】二分查找法_第9张图片

   结果输出无误,程序可以正常运行。

2.3拓展题

  二分查找法基本思路就如上所示,如果一个数组并非是有序的,而是一个先升后降/先降后升的数组。那么如何使用二分检索的思路来寻找出数组中的最大值呢?

【javascript算法】二分查找法_第10张图片

  如果你已经有答案了,欢迎评论区或者私信告诉我你的答案哦!

  关于以上这个问题,我已经在下面这篇文章写出了自己的思路。欢迎大家一起来交流哦!

https://blog.csdn.net/qq_51869518/article/details/127500143?spm=1001.2014.3001.5501icon-default.png?t=M85Bhttps://blog.csdn.net/qq_51869518/article/details/127500143?spm=1001.2014.3001.5501


创作不易,希望能够支持一下!

什么是支持呢?

(ノ∇︎〃 )

点个赞,收藏一下,点个关注之类的。

如果你有更好的想法或者发现文章的不足之处,望大家不吝赐教!

你可能感兴趣的:(算法,算法,javascript,前端,开发语言,1024程序员节)