二分查找

来源:互联网 发布:承接淘宝服装代加工 编辑:程序博客网 时间:2024/06/07 12:24

一直以为二分查找很简单,,但是真写的时候半个小时都没写对。

  • 二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。
  • 二分查找的一个条件是待查询的数组是有序的,我们假设这里的数组是升序的。
  • 二分查找的主要思路就是设定两个指针start和end分别指向数组元素的收尾两端,然后比较数组中间结点arry[mid]和待查找元素。如果待查找元素小于中间元素,那么表明带查找元素在数组的前半段,那么将end=mid-1,如果待查找元素大于中间元素,那么表明该元素在数组的后半段,将start=mid+1;如果中间元素等于待查找元素,那么返回mid的值。

二分查找可以使用递归和非递归的方法来解决,下面给出代码实例。

package com.cn.gao;public class BinaySearch {    public static void main(String[] args){        int[] arr = {15, 18, 30, 36, 36, 45, 48, 53, 72, 93};        int[] arr1=null;        BinaySearch bs = new BinaySearch();        int pos = bs.binarySearch2(arr1,0,arr1.length-1,72);        if(pos == -1){            System.out.println("no num");        }else{            System.out.println(pos);        }    }    //递归    public int binarySearch1(int[] arr,int left,int right,int key){        if(arr == null || arr.length == 0)            return -1;        if(left<right){            if(key<arr[left] || key>arr[right])                return -1;            if(key == arr[left])                return left;            if(key == arr[right])                return right;            int middle = (left + right)/2;            if(arr[middle]==key){                return middle;            }            if(arr[middle]>key){                return binarySearch1(arr,left,middle-1,key);            }            if(arr[middle]<key){                return binarySearch1(arr,middle+1,right,key);            }        }        return -1;    }    //非递归    public int binarySearch2(int[] arr,int left,int right,int key){        if(arr == null || arr.length == 0)            return -1;        while(left<right){            if(key<arr[left] || key>arr[right])                return -1;            if(key == arr[left])                return left;            if(key == arr[right])                return right;            int middle = (left + right)/2;            if(arr[middle]==key){                return middle;            }            if(arr[middle]>key){                right = middle -1;            }            if(arr[middle]<key){                left = middle + 1;            }        }        return -1;    }}
0 0
原创粉丝点击