算法 之 分治 - 二分搜索

本文介绍了经典的二分搜索算法,详细解释了其工作原理及步骤,并通过Java代码实现了该算法。此外,还提供了用于验证算法正确性的示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回忆一下二分搜索,将一个给定的元素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];
				}
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值