经典面试题:请手写一个二分查找法

Posted 恰好有空静下来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典面试题:请手写一个二分查找法相关的知识,希望对你有一定的参考价值。

二分查找又称折半查找,它是一种效率较高的查找方法。

1.二分查找要求

(1)必须采用顺序存储结构

(2).必须按关键字大小有序排列

2.二分查找法原理:

将数组分为三部分,依次是中值前,中值(所谓的中值就是数组中间位置的那个值),中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前 面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。
3.二分查找Jdk8源码:
// Like public version, but without range checks.    private static int binarySearch(int[] a, int fromIndex, int toIndex, int key) { int low = fromIndex; int high = toIndex - 1;
while (low <= high) { int mid = (low + high) >>> 1; int 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. }

4.递归实现二分查找:

//递归实现二分查找 private static int binarySearchDiGui(int[] arr, int data, int beginIndex, int endIndex) { if (arr == null) { return -1; } int midIndex = (beginIndex + endIndex) >>> 1; if (data < arr[beginIndex] || data > arr[endIndex] || beginIndex > endIndex) { return -1; } if (data > arr[midIndex]) { //递归,如果查找的数据大于中值,则以中值+1为起始索引查找 return binarySearchDiGui(arr, data, midIndex + 1, endIndex); } if (data < arr[midIndex]) { //递归,如果查找的数据大于中值,则以中值+1为起始索引查找 return binarySearchDiGui(arr, data, beginIndex, midIndex - 1); } else { return midIndex; } }


以上是关于经典面试题:请手写一个二分查找法的主要内容,如果未能解决你的问题,请参考以下文章

算法面试题——二分查找套路法

[经典面试题]二分查找问题汇总

面试真经-如何快速手写二分查找?

从0到1学算法二分查找法

经典面试题

Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序