回忆一下二分搜索,将一个给定的元素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];
}
}
}
}
}
分享到:
相关推荐
相比于二分查找,三分法在某些情况下可以提供更快的查找速度,尤其是在数据分布不均匀的情况下。其基本步骤如下: 1. 将数组分为左、中、右三部分,每部分大致相等。 2. 检查中间元素,如果中间元素就是目标值,...
**二分法(Binary Search)**,又称为折半搜索或二分查找,是一种在有序数组中查找特定元素的搜索算法。它的基本思想是利用分治策略,将问题规模不断减半,直到找到目标值或者确定目标不存在。二分法在计算机科学中...
1. **初始化**:首先对原始数据进行预处理,可以采用二分查找等方法找到每个元素的最近分割线,然后计算每个元素对应的最值。 2. **查询处理**:对于每个查询区间,从左到右遍历分割线,比较分割线两侧的最值,更新...
- **搜索问题**:如二分查找。在有序数组中寻找目标值,每次查找都使搜索范围减半,直到找到目标或确定不存在。 - **矩阵乘法**:Strassen算法通过分解矩阵来减少乘法操作的数量。 - **最短路径问题**:Floyd-...
二分查找是一种基于分治策略的高效搜索算法,主要应用于有序数据集合。在给定的升序排列的数组a[0:n-1]中,二分查找的目标是找到特定元素x的位置,或者确认元素不在数组中。算法的基本步骤如下: 1. **分解**:将...
1048 - Follow My Logic可能涉及二分查找,这是分治的一个典型应用,通过不断缩小搜索范围找到目标值。 在1054 - The Troublesome Frog中,青蛙跳河问题可能需要用到动态规划和递归相结合的方法,通过分析青蛙跳跃...
二分搜索算法是一种高效的数据查找方法,属于分治策略的典型应用。在已排序的数组中,二分搜索通过不断将查找区间减半来定位目标元素。以下是关于这个实验报告的详细解读: 1. **问题描述**:实验要求在给定的、已...
二分查找基于分治算法的实现
给定一个有序数组和一个目标值,二分查找会不断地将搜索区间减半,直到找到目标值或者确定不存在。 除了以上提到的算法,分治方法还被应用于很多其他领域,如**大整数乘法**(Karatsuba算法和Toom-Cook算法)、**最...
分治法实现二分查找算法实现 分治法实现二分查找算法实现 分治法实现二分查找算法实现
2. 搜索算法:如二分查找、广度优先搜索(BFS)和深度优先搜索(DFS)。这些算法常用于在有序或无序的数据结构中查找特定元素,或遍历图形结构。 3. 图论算法:如Dijkstra最短路径算法、Floyd-Warshall算法、Prim...
在分治法的应用中,二分搜索算法是一个典型例子。在二分搜索中,数据被分成两半进行处理,这有效地减少了搜索的范围,因此可以快速定位目标值。此外,归并排序和快速排序也是应用分治法的典型排序算法,它们都利用了...
1. **基础算法**:在源代码中,你将找到诸如排序、查找等经典算法的实现,如冒泡排序、插入排序、选择排序、快速排序、二分查找等。这些算法是所有编程学习者的基石,通过它们你可以理解数据结构和算法的基本思想。 ...
- **二分查找** - **描述**: 在已排序的数组中查找特定元素。 - **分析**: - 当数组规模减小到只包含一个元素时,可以直接判断是否找到了目标值。 - 每次选择数组的中间元素与目标值进行比较,根据比较结果...
这是采用递归分治算法写的二分搜索算法, 是为上机考试准备的,呵呵呵
分治法在许多算法中都有应用,比如快速排序(Quick Sort)、归并排序(Merge Sort)、二分搜索(Binary Search)、大整数乘法(如Karatsuba算法和Strassen算法)等。 3. 快速排序(Quick Sort): 快速排序通过一个...
2. **查找算法**:包括线性查找、二分查找以及哈希查找等。线性查找适用于小规模数据,而二分查找在有序数组中表现出色。哈希查找则利用了哈希表,提供近乎常数时间的查找速度。 3. **图论与树**:可能包含图的遍历...
【分治算法】是计算机科学中一种重要的算法思想,它将一个大问题分解为若干个小问题,分别解决小问题后再合并结果,以达到解决整个大问题的目的。在本实验报告中,分治法具体体现在快速排序算法的实现上。 **快速...
实验涉及的主要算法包括二分搜索、合并排序以及可选的阶乘计算(分别用递归和分治方法实现)。使用的编程语言是Python。 分治算法是一种解决问题的策略,它将一个大问题分解成若干个规模较小、相互独立、与原问题...