vlambda博客
学习文章列表

【剑指Offer】查找算法——二分查找

一、算法简介

二分查找又叫折半查找,需求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找过程。直到查找到了为止,否则序列中没有待查的关键字。



二、时间复杂度

由于二分查找每次查询都是从数组中间切开查询,所以每次查询,剩余的查询数为上一次的一半,从下表可以清晰的看出查询次数与剩余元素数量对应关系


表-查询次数及剩余数


      第几次查询               剩余待查询元素数量


      1      


           N/2                


      2


        N/(2^2)


      3


        N/(2^3)


      4


            …


      5


        N/(2^K)


从上表可以看出N/(2^K)肯定是大于等于1,也就是N/(2^K)>=1,我们计算时间复杂度是按照最坏的情况进行计算,也就是是查到剩余最后一个数才查到我们想要的数据,也就是 

N/(2^K)=1 
=>N=2^K 
=>K=log2N 


所以二分查找的时间复杂度为O(log2N)



三、代码实现

package cn.dzp.flyroc.search;
import java.util.Scanner;
public class BinarySearchDemo {
public static void main(String[] args) {
int[] arr = {2, 3, 6, 8, 11, 65, 32, 97, 100}; Scanner scanner = new Scanner(System.in); binarySearch(arr, scanner.nextInt()); }
//二分查找 public static void binarySearch(int[] arr, int key) {
int low = 0; int high = arr.length; for (int i = 0; i < high;){ //先遍历这个数组,判断这个元素是否存在
if (arr[i] != key){ if (i == high-1){ //当遍历到数组最后一个索引时 System.out.println("不存在这个元素"); return; } i++; }else { //这个元素在数组中存在
int mid; //定义中间值 while (low <= high){ mid = (low+high)>>1; //求中间值 if (arr[mid] == key){ System.out.println(key+"元素对应的索引是:"+mid); return; }else if (arr[mid] < key){ //中间值小 low = mid +1; }else { //中间值大 high = mid -1; } } } } }}



【剑指Offer】算法系列,本人会持续写出代码实现过程,敬请期待,请持续关注大数据健身侠: