`
flforever1213
  • 浏览: 124660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法 之 分治 - 二分搜索

阅读更多

回忆一下二分搜索,将一个给定的元素x与一个已排序数组A[low...high]的中间元素作比较,

如果x<A[mid] ( mid=(low + high)/2⌋ ) ,则不考虑A[mid...high],而对A[low...mid-1]重复实施相同的方法。

类似地,如果x>A[mid],就对A[mid+1...high]重复实施相同的方法。

这个就是今天介绍的著名的二分搜索算法。

 

过程  BinarySearch

输入  按非降序排列的n个元素的数组A[1...n]和元素x

输出  如果x=A[j],则输出j;否则输出-1

 

算法描述  binarysearch(low, high)

if low > high then return -1

else

    mid ← (low + high) / 2

    if x = A[mid] then return mid

    else if x < A[mid] then return binarysearch(low, mid - 1)

    else return binarysearch(mid + 1, high)

end if

 

这个算法比较简单,大家可以估算一下它的时间复杂性是 log n,下面是这个算法的 Java 实现:

 

DivideAndConquer.java 包含实现 BinarySearch 算法的类:

public class DivideAndConquer
{
	public static int binarySearch(int[] array, int value, int low, int high)
	{
		if (low > high)
			return -1;

		int middle = (low + high) / 2;
		
		if (value == array[middle])
		{
			return middle;
		}
		else if (value < array[middle])
		{
			return binarySearch(array, value, low, middle - 1);
		}
		else
		{
			return binarySearch(array, value, middle + 1, high);
		}
	}
}

 

Program.java 包含程序的入口方法,这里面还对传入的数组进行了一次冒泡排序,来保证传入的数组是有序的:

public class Program
{
	public static void main(String[] args)
	{
		int[] array = new int[] { 332, 566, 51, 70, 98, 19, 24, 637,
			53456, 3321, -235, -34, 5, 45, 77, 36 };
		
		bubbleSort(array);
		
		System.out.print("Initialize sorted array: ");
		for (int i : array)
		{
			System.out.printf("%d ", i);
		}
		
		int valueToBeFound = 70;
		int index = DivideAndConquer.binarySearch(
			array, valueToBeFound, 0, array.length - 1);
		System.out.printf("\n%d is found at position %d.", valueToBeFound, index);
	}

	private static void bubbleSort(int[] array)
	{
		for (int i = 0; i < array.length; i++)
		{
			for (int j = array.length - 1; j > i; j--)
			{
				if (array[i] > array[j])
				{
					// 交换array[i]和array[j]的位置
					array[i] = array[i] + array[j];
					array[j] = array[i] - array[j];
					array[i] = array[i] - array[j];
				}
			}
		}
	}
}
0
1
分享到:
评论

相关推荐

    算法-分治- 三分法(包含源程序).rar

    相比于二分查找,三分法在某些情况下可以提供更快的查找速度,尤其是在数据分布不均匀的情况下。其基本步骤如下: 1. 将数组分为左、中、右三部分,每部分大致相等。 2. 检查中间元素,如果中间元素就是目标值,...

    算法-分治- 二分法(包含源程序).rar

    **二分法(Binary Search)**,又称为折半搜索或二分查找,是一种在有序数组中查找特定元素的搜索算法。它的基本思想是利用分治策略,将问题规模不断减半,直到找到目标值或者确定目标不存在。二分法在计算机科学中...

    算法-分治- 莫队算法- 带修莫队(包含源程序).rar

    1. **初始化**:首先对原始数据进行预处理,可以采用二分查找等方法找到每个元素的最近分割线,然后计算每个元素对应的最值。 2. **查询处理**:对于每个查询区间,从左到右遍历分割线,比较分割线两侧的最值,更新...

    计算机算法-分治算法

    - **搜索问题**:如二分查找。在有序数组中寻找目标值,每次查找都使搜索范围减半,直到找到目标或确定不存在。 - **矩阵乘法**:Strassen算法通过分解矩阵来减少乘法操作的数量。 - **最短路径问题**:Floyd-...

    计算机算法分析 二分查找 分治算法

    二分查找是一种基于分治策略的高效搜索算法,主要应用于有序数据集合。在给定的升序排列的数组a[0:n-1]中,二分查找的目标是找到特定元素x的位置,或者确认元素不在数组中。算法的基本步骤如下: 1. **分解**:将...

    递归与分治--acm竞赛资料

    1048 - Follow My Logic可能涉及二分查找,这是分治的一个典型应用,通过不断缩小搜索范围找到目标值。 在1054 - The Troublesome Frog中,青蛙跳河问题可能需要用到动态规划和递归相结合的方法,通过分析青蛙跳跃...

    二分搜索算法(分治策略)报告.doc

    二分搜索算法是一种高效的数据查找方法,属于分治策略的典型应用。在已排序的数组中,二分搜索通过不断将查找区间减半来定位目标元素。以下是关于这个实验报告的详细解读: 1. **问题描述**:实验要求在给定的、已...

    分治算法之二分查找实现

    二分查找基于分治算法的实现

    算法——分治算法原理

    给定一个有序数组和一个目标值,二分查找会不断地将搜索区间减半,直到找到目标值或者确定不存在。 除了以上提到的算法,分治方法还被应用于很多其他领域,如**大整数乘法**(Karatsuba算法和Toom-Cook算法)、**最...

    分治法实现二分查找算法实现

    分治法实现二分查找算法实现 分治法实现二分查找算法实现 分治法实现二分查找算法实现

    常用算法程序集-徐士良-常用算法程序集-徐士良

    2. 搜索算法:如二分查找、广度优先搜索(BFS)和深度优先搜索(DFS)。这些算法常用于在有序或无序的数据结构中查找特定元素,或遍历图形结构。 3. 图论算法:如Dijkstra最短路径算法、Floyd-Warshall算法、Prim...

    算法设计策略 - 05-2 分治法.pdf

    在分治法的应用中,二分搜索算法是一个典型例子。在二分搜索中,数据被分成两半进行处理,这有效地减少了搜索的范围,因此可以快速定位目标值。此外,归并排序和快速排序也是应用分治法的典型排序算法,它们都利用了...

    《C常用算法程序集-徐士良》源代码

    1. **基础算法**:在源代码中,你将找到诸如排序、查找等经典算法的实现,如冒泡排序、插入排序、选择排序、快速排序、二分查找等。这些算法是所有编程学习者的基石,通过它们你可以理解数据结构和算法的基本思想。 ...

    算法分析分治策略

    - **二分查找** - **描述**: 在已排序的数组中查找特定元素。 - **分析**: - 当数组规模减小到只包含一个元素时,可以直接判断是否找到了目标值。 - 每次选择数组的中间元素与目标值进行比较,根据比较结果...

    采用递归分治写的二分搜索算法

    这是采用递归分治算法写的二分搜索算法, 是为上机考试准备的,呵呵呵

    算法分析之分治法

    分治法在许多算法中都有应用,比如快速排序(Quick Sort)、归并排序(Merge Sort)、二分搜索(Binary Search)、大整数乘法(如Karatsuba算法和Strassen算法)等。 3. 快速排序(Quick Sort): 快速排序通过一个...

    C 常用算法程序集-徐士良

    2. **查找算法**:包括线性查找、二分查找以及哈希查找等。线性查找适用于小规模数据,而二分查找在有序数组中表现出色。哈希查找则利用了哈希表,提供近乎常数时间的查找速度。 3. **图论与树**:可能包含图的遍历...

    算法分析与设计实验报告-分治法.docx

    【分治算法】是计算机科学中一种重要的算法思想,它将一个大问题分解为若干个小问题,分别解决小问题后再合并结果,以达到解决整个大问题的目的。在本实验报告中,分治法具体体现在快速排序算法的实现上。 **快速...

    《算法设计与分析》实验报告:实验一(分治策略)

    实验涉及的主要算法包括二分搜索、合并排序以及可选的阶乘计算(分别用递归和分治方法实现)。使用的编程语言是Python。 分治算法是一种解决问题的策略,它将一个大问题分解成若干个规模较小、相互独立、与原问题...

Global site tag (gtag.js) - Google Analytics