龙空技术网

【面试真题】折半查找算法

兔子六号 85

前言:

今天看官们对“算法真题”大概比较关注,同学们都想要了解一些“算法真题”的相关资讯。那么小编同时在网上搜集了一些对于“算法真题””的相关资讯,希望看官们能喜欢,咱们一起来学习一下吧!

真题

对于数列4、5、6、7、9、12、18、23,如果采用折半查找元素9,请问需要查找几次?()

A、2

B、3

C、4

D、5

解析

折半查找(Binary Search),也称二分查找,是一种在有序数组中查找特定元素的搜索算法。

折半查找的基本思想是将有序数组分成两个部分,比较中间元素与目标值的大小,如果中间元素等于目标值,则查找成功;如果中间元素大于目标值,则在左半部分继续查找;如果中间元素小于目标值,则在右半部分继续查找。这样递归进行直到找到目标值或者查找范围为空为止。

折半查找有几个值得注意的点:

需要查找的数组必须是有序的,且数组中不能存在重复的数字如何找到数组的中间位置?一般是利用(第一元素的角标 + 最后一个元素的角标)/2如果数组是奇数位怎么办?这种好办,找中间位时会直接找到一个中间元素,进行对比即可如果数组是偶数位怎么办?这种找中间位找到的角标一般有小数位,不能直接使用。这个时候一般利用取整来找最近的元素进行比较,比如题目中一共有8个数字,取中间角标为(0+7)/2=3.5,这个时候我们直接取角标为3的元素与需要被查找的元素进行对比,即取7与9进行对比。

利用以上知识,我们推演一下题目中的对比过程:

第一次:我们取中间角标(0+7)/2=3.5,取角标为3的元素,num[3] = 7,而7<9,则舍弃左半部分,利用右半部分再次查找。此时,右半部分为:9、12、18、23。

第二次:我们取中间角标(4+7)/2 = 5.5, 取角标为5的元素,num[5] = 12, 而12>9,则舍弃右半部分,利用左半部分再次查找。此时,左半部分为:9、12。

第三次:我们取中间角标(4+5)/2 = 4.5,取角标为4的元素,num[4] = 9, 而9=9,即找到了此元素。

因此此题的答案为B。

下面是一段java编写的二分查找的示例代码,也可以进行验证:

public class BinarySearchTest {    public static void main(String[] args) {        int[] nums = new int[]{4,5,6,7,9,12,18,23};        binarySearch(nums,9);    }    public static void binarySearch(int[] nums,int num){        //定义结果变量        int i = -1;        int count = 0;        //定义头、尾位置        int head = 0;        int tail = nums.length - 1;        //循环查找        while (true) {            count++;            //定义中间位置            int total = (head + tail);            int middleIndex = total/2;            int middleValue = nums[middleIndex];            //判断是奇数数组还是偶数数组 true为偶数数组            boolean flag = total%2==0?true:false;            //判断结果            if (num == middleValue) {                i = middleIndex;                break;            } else if (num < middleValue) {                //重新定义查找区间                head = head;                tail = flag?(middleIndex - 1) : middleIndex;            } else {                head = middleIndex + 1;                tail = tail;            }            if (head == tail) {                //元素不在数组内,直接返回                break;            }        }        System.out.println("找了" + count + "次!");        System.out.println(i == -1?"未找到该元素":"元素" + num + "在第" + (i+1) +"位上!");    }}

标签: #算法真题 #折半查找的实现实验报告 #折半查找的递归算法的时间性能 #折半查找法流程图例题 #折半查找法简单例题