使用迭代和递归分别实现java中的二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

本篇代码分别采用了两种方法来实现二分查找,方法arr1是迭代,方法arr2是递归

数组内容可以随意更改,但必须由小到大排列

public class BinaryTest {
	
	public static int compare(int low,int high,int length) {
		if (low >= 0 && high <= length - 1 && low <= high)
			return 1;
		else
			return -1;
	}
	
	public static int arr1(int[] array, int low,int high,int value) {//方法1:迭代
			while (low <= high) {
				//int middle = (low + high) / 2;//存在溢出
				int middle = (high - low)/2+low;
				if (value == array[middle])
					return middle;
				if (value > array[middle])
					low = middle + 1;
				if (value < array[middle])
					high = middle - 1;
			}
		return -1;
	}
	
	public static int arr2(int[] array,int low,int high,int value) {//方法2:递归
		assert low<high;
		int middle = (high - low)/2+low;
		if (array[middle] == value)
			return middle;
		else if (array[middle] < value)
			return arr2(array,middle+1,high,value);
		else if (array[middle] > value)
			return arr2(array,low,middle-1,value);
		else
			return -1;
	}
	
	public static void main(String[] args) {
		int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		for (int i : a) {
			System.out.format("%3d", i);
		}
		System.out.println("\n请输入您要查找的数字:");
		java.util.Scanner s = new java.util.Scanner(System.in);
		int num = s.nextInt();
		System.out.println("请输入您要查找的范围起点:");
		java.util.Scanner l = new java.util.Scanner(System.in);
		int low = l.nextInt();
		System.out.println("请输入您要查找的范围终点:");
		java.util.Scanner h = new java.util.Scanner(System.in);
		int high = h.nextInt();
		
		int value = compare(low,high,a.length);//实现输入范围合法化
		if(value == -1)
			System.out.println("您输入的范围有误!");
		else {
			boolean flag = false;
			for (int k = low; k <= high; k++) {
				if (num == a[k])
					flag = true;
			}
			if (flag == false) {
				System.out.println("您输入的数字不在该范围内!");
				return;
			}
			//value = arr1(a,low,high,num);//迭代实现折半查找
			value = arr2(a,low,high,num);//递归实现折半查找
			if(value == -1)
				System.out.println("输入的数字不在该范围内!");
			else
				System.out.println("经过二分法查找得知该数组中第" + (value + 1) + "个数是查找的值。");
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值