zoukankan      html  css  js  c++  java
  • 二分查找递归与非递归的实现形式

    二分查找

    思想

    • 首先数组必须是有序的
    • 对于一个有序的数组,那么其中值一定位于中间的位置,我们拿待查找的值与中间的值进行比较
    • 如果待查找的值比中间值小,那么就去中间值的左边进行查找,否则就去中间值的右边查找
    • 这样最左边的值到中间值的前一个值这一段或者是中间值的后一个值到最后一个值这一段,又可以看做是一个新的序列,可以对其继续用二分法查找
    • 直到找到元素,或者干脆找不到,也就是发现左边没有,右边也没有,左右碰头了的情况

    图解

    现在我们在数组{2,4,5,7,,8,9,13,23,34,45}中查找元素23,过程如图:

    参考博客https://www.cnblogs.com/ider/archive/2012/04/01/binary_search.html

    代码实现

    package search;
    //二分查找使用的前提必须是有序的
    public class BinarySearch {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int[] arr= {1,2,3,4,5,6,7,8,9};
    		int index1=recursiveBinarySearch(arr, 0, arr.length-1, 5);
    		int index2=binarySearch(arr, 5);
    		System.out.println(index1);
    		System.out.println(index2);
    	}
    	
    	
    	public static int recursiveBinarySearch(int[] arr,int left,int right,int value)
    	{
    		if(left>right)//没找到碰头
    		{
    			return -1;
    		}
    		int mid=(left+right)/2;
    		int minVal=arr[mid];
    		if(arr[mid]==value)//找到
    		{
    			return mid;
    		}
    		else if(arr[mid]>value)//比中值大去右边找
    		{
    			return recursiveBinarySearch(arr, left, mid-1, value);
    		}
    		else//比中值小去左边找
    		{
    			return recursiveBinarySearch(arr, mid+1, right, value);
    		}	
    	}
    	
    	public static int binarySearch(int[] arr,int target)
    	{
    		if(arr==null||arr.length<=0)
    		{
    			return -1;
    		}
    		int left=0;
    		int right=arr.length-1;
    		while(left<=right)
    		{
    			int mid=left+(right-left)/2;
    			if(arr[mid]==target)//找到
    			{
    				return mid;
    			}
    			else if(arr[mid]>target)//比中值大去右边找
    			{
    				right=mid-1;
    			}
    			else {//比中值小去左边找
    				left=mid+1;
    			}
    		}
    		return -1;
    	}
    
    }
    
    

    总结

    • 二分查找要求数组有序
    • 二分查找时间复杂度为(O(logN))
  • 相关阅读:
    JVM的生命周期、体系结构、内存管理和垃圾回收机制
    JVM的ClassLoader过程分析
    MySQL Cluster配置概述
    tomcat下bin文件夹下shell文件分析
    Eclipse环境下使用Maven注意事项
    mysql服务器的字符集
    判断文件中是否存在中文字符
    Tomcat/JSP中文编码配置
    Java内存泄露的原因
    Python 开发轻量级爬虫08
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11740510.html
Copyright © 2011-2022 走看看