`

java算法基础--二分查找

阅读更多
基本概念:二分查找又称折半查找,要求待查找数组有序;优点是比较次数少,查找速度快;其缺点是要求待查表为有序表。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

基本思想:首先假设已排序好的序列是升序,将要查找的元素与序列中间的元素比较,若相等,则查找成功;若待查找元素比中间元素大,则查找除去中间元素的后半部分序列,反之,则查找去除中间元素的前半部分序列,直到查到相同的元素或者所查找的序列范围为空为止。

实现思路:还是假设数组元素是升序的,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的value作比较,如果value=a[n/2]则找到value,算法终止。如 果value<a[n/2],则我们只要在数组a的左半部继续查找value。如果value>a[n/2],则我们只要在数组a的右半部继续查找value。

性能分析:若数组长度为n,则算法复杂度为O(log n)

具体代码:(非递归版)
public class binarySearchTest {

	public static int binarySearch(int[] a,int value)
	{
		//若数组为空,则返回-1
		if(a.length == 0 )
		{
			return -1;
		}
		
		int low = 0;
		int high = a.length - 1;
		
		while(low <= high)
		{
			int mid = (low + high) / 2;//这个是有BUG的
			
			//打印中间元素选取过程,只是显示过程,与算法本身无关
			for(int i = 0;i < a.length;i++)
			{
				System.out.print(a[i]);
				if(i == mid)
				{
					System.out.print("#");//用#号表示中间元素
				}
				System.out.print(" ");//各个元素用空格隔开
			}
			System.out.println();//每次选取过程换行
			
			//核心
			if(value == a[mid])
			{
				return mid;
			}
			else if(value > a[mid])
			{
				low = mid + 1;
			}
			else
			{
				high = mid - 1;
			}
		}
		
		return -1; //不存在该元素则返回-1   
	}
	public static void main(String[] args) {
		int[] a={1,3,4,5,8,7,9,11,15};  
		System.out.println(binarySearch(a,9));
		
	}
}


具体代码:(递归版)
public class binarySearchRecursionTest {
	
	public static int binarySearchRecursion(int[] a,int fromIndex,int toIndex,int key)
	{
		if(fromIndex > toIndex) return -1;
		int midIndex = (fromIndex + toIndex) / 2;//这个是有BUG的
		int midVal = a[midIndex];
		
		if(midVal > key)
		{
			return binarySearchRecursion(a,fromIndex,midIndex - 1,key);
		}
		else if(midVal <key)
		{
			return binarySearchRecursion(a, midIndex + 1, toIndex, key);
		}
		else
		{
			return midIndex;
		}
		
	}

	public static void main(String[] args) {
		int[] a={1,3,4,5,8,7,9,11,15};  
		System.out.println(binarySearchRecursion(a,0,a.length,9));
	}
}


代码分析早前的jdk中Arrays类中的二分查找存在一个临界值的bug,bug在代码中的int mid = (low + high) / 2;当low + high大于正int范围时就会溢出,会抛出ArrayIndexOutOfBoundsException 异常。

解决办法:将int mid = (low + high) / 2修改为
                 int mid = low + ((high - low) / 2);
或者         int mid = (low + high) >>> 1;(最新的java.util.Arrays中用的是这个办法)
分享到:
评论

相关推荐

    经典Java笔试算法解析和代码:二分查找.zip

    经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找.zip 经典Java笔试算法解析和代码:二分查找...

    分别使用Java和Python实现二分查找算法

    二分查找:分别使用Java和Python实现二分查找算法 二分查找:分别使用Java和Python实现二分查找算法 二分查找:分别使用Java和Python实现二分查找算法 二分查找:分别使用Java和Python实现二分查找算法 二分查找:...

    Java二分查找递归算法

    Java二分查找递归算法

    Java 二分查找 算法

    以下是一个简单的 Java 二分查找算法示例: ```java public class BinarySearchDemo { public static int binarySearch(int[] array, int target) { if (array == null || array.length == 0) { return -1; } ...

    算法分析与设计-实验二 二分查找实验报告.docx

    二分查找算法是一种高效的数据搜索方法,主要应用于已排序的序列。它的基本思想是通过不断地将待搜索区域减半来快速定位目标值。这个过程基于分治策略,将大问题分解为更小的子问题来解决。在二分查找算法中,每次...

    java二分查找算法

    ### Java二分查找算法知识点详解 #### 一、二分查找算法概述 二分查找算法是一种在有序数组中查找特定元素的搜索算法。其工作原理是通过将目标值与数组中间元素进行比较来缩小搜索范围,进而达到快速查找的目的。...

    java算法思想-第五章.pdf

    接着,我们讨论折半查找,也称为二分查找。这种方法适用于已排序的数组,其效率显著高于顺序查找。折半查找的基本步骤是先确定待查找区间的边界,然后计算中间位置的索引,如果中间元素等于目标值,则返回该索引;...

    数据查找算法之-二分查找

    本代码是利用java语言实现基本数据查询功能,实现算法为二分查找法

    二分查找算法实现-修正1

    二分查找算法实现-修正1 二分查找算法是计算机科学中一种常用的查找算法,通过将要查找的数组分成两半,并不断缩小查找范围来找到目标元素。该算法的实现可以在多种编程语言中使用,包括C++、Java、C#等。 在给定...

    图解算法小册-Java版

    - **搜索算法**:如二分查找、广度优先搜索(BFS)、深度优先搜索(DFS)等,这些算法在数据检索和路径寻找方面非常有用。 - **图算法**:涉及最短路径(如Dijkstra算法、Floyd算法)、最小生成树(如Prim算法、...

    史上最全,逻辑最清晰的Java经典算法教程:二分查找

    在Java中实现二分查找,首先需要一个已排序的数组。在提供的代码示例中,我们有一个名为`sortedArray`的整数数组,包含一系列递增的数值。目标是查找特定的`target`值。 `binarySearch`方法是实现二分查找的核心。...

    算法导论-java

    10. **递归与分治**:递归是算法导论中的重要主题,如二分查找、斐波那契数列等。Java中的递归函数可以简洁地表达复杂问题,但要注意防止栈溢出。 11. **复杂度分析**:了解时间复杂度和空间复杂度是评估算法效率的...

    算法-理论基础- 查找(包含源程序).rar

    3. **二分查找**:二分查找只适用于有序的数据集合,如数组。它通过不断将搜索区间减半来缩小查找范围,平均时间复杂度为O(log n)。二分查找的实现需要递归或循环结构。 4. **哈希查找**:哈希查找利用哈希函数将...

    java二分查找实现

    Java 二分查找是搜索有序数组中某个元素的最常用算法之一。它的实现原理是将数组分成两个部分,然后在其中一个部分继续进行搜索,直到找到目标元素或确定目标元素不存在。下面将详细介绍 Java 二分查找的实现技术。 ...

    算法 第4版-谢路云 译(Java描述)-完整版

    - **二分搜索**:适用于有序数组,每次都将搜索区间减半,直到找到目标或搜索区间为空。 - **广度优先搜索(BFS)**:从根节点开始,然后遍历所有相邻节点,然后再移动到下一层。 - **深度优先搜索(DFS)**:尽可能深地...

    数据结构与算法--Java语言描述

    典型的算法包括排序(如冒泡排序、选择排序、插入排序、快速排序、归并排序等)、查找(线性查找、二分查找、哈希查找等)、图的遍历(深度优先搜索DFS和广度优先搜索BFS)、动态规划、贪心算法以及回溯法等。...

    java 几种查找算法

    根据给定的文件信息,我们可以总结出几种在Java中实现的...以上算法在Java中的实现涵盖了从简单到复杂的查找技术,包括线性查找、二分查找以及基于树的数据结构查找,为程序员提供了多种选择,以适应不同场景下的需求。

    算法-理论基础- 查找- 顺序查找(包含源程序).rar

    然而,其主要缺点在于效率低,尤其是在大数据集上,查找速度明显慢于二分查找、哈希查找等更高效的算法。 **改进** 虽然顺序查找效率不高,但可以通过一些策略来优化。例如,可以并行化查找过程,将数据集分成多个...

    数据结构与算法(Java版本)

    搜索算法包括线性搜索、二分搜索以及更高级的哈希映射。在Java中,`Arrays.sort()`方法提供了对数组的排序功能,而`Collections.sort()`适用于集合。 递归和动态规划是解决问题的强大工具。递归通过调用自身解决...

    java排序算法-大全.rar

    2. **折半排序**:这里的“折半”可能是指二分查找排序(Binary Insertion Sort),它是在插入排序的基础上改进的,当在有序序列中插入一个元素时,采用二分查找的方法找到插入位置,以减少比较次数。这种排序方法在...

Global site tag (gtag.js) - Google Analytics