java数据结构之折半查找

折半查找,也称二分法查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法,这里强调有序表明这种算法的特定使用场景;

搜素过程为,从数组中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;

如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组已经为空,则表示找不到指定的元素。这种搜索算法每一次比较都使搜索范围缩小一半,相比顺序查找,其时间复杂度是O(logN);

折半查找的精髓在于这个折半的程序代码的编写,这里将使用两种方式进行折半查找,第一张是按照上述解释的意思,每次排除一般的数据,另一种方式是,考虑到查找的过程的重复性,使用递归算法进行查找,下面上代码,

1、给定一个有序数组,再给定一个特定的数据,如果这个数据存在于这个数组中,返回数据对应的下标,否则返回-1,代码比较简单,相信大家一看就懂;

public class TestSearch {
	
	public static void main(String[] args) {
		//定义一个数组
		int[] searchArr = {1,2,3,4,5,6,7,8,9,10};
		//给定要查找的数
		int num = 5;
		//执行查找
		int index = -1;
		for(int i=0;i<searchArr.length;i++){
			if(num == searchArr[i]){
				index = i;
			}
		}
		if(index == -1){
			System.out.println("没有找到");
		}else{
			System.out.println("找到了这个数,在数组中的下标是:" + index );
		}
	}
}

2、下面用折半查找第一种方式来做

/**
	 * @param arr  给定数组
	 * @param key  要查找的值
	 * @return
	 */
	public static int doSearch(int[] arr,int key){
		//指定一个最小值
		int low = 0;
		//指定最大值
		int high = arr.length - 1;
		//判断key和middle的关系
		while(low <= high){
			//初始化指定一个中间值
			int middle = (low + high)/2;
			if(key == arr[middle]){
				return middle;
			}else if(key < arr[middle]){
				high = middle - 1;
			}else if(key > arr[middle]){
				low = middle + 1;
			}
		}
		return -1;
	}

然后再在main函数中调用,

public static void main(String[] args) {
		int[] array = {1,2,3,4,5,6,7,8,9,10};
		//给定要查找的数据
		int key = 3;
		//执行查找的流程,不使用递归
		int index = doSearch(array, key);
		//折半查找,采用递归算法
		//int index = bianarySearch(array,key);
		//输出结果
		if(index == -1){
			System.out.println("要查找的数据不存在");
		}else{
			System.out.println("数据所在的下标是:" + index);
		}
	}

运行,可以看到要查找的结果是否在我们的数组中,

下面采用递归的方式进行查找,

/**
	 * 递归进行折半查找数据
	 * @param arr
	 * @param key
	 * @return
	 */
	public static int bianarySearch(int[] arr,int key){
		int low = 0;	//从0开始
		int high = arr.length - 1;
		return doSearchForDiGui(arr,key,low,high);
	}
	
	/**
	 * 递归方式查找
	 * @param arr	给定数据
	 * @param key	要查找的数据
	 * @param low	最小下标
	 * @param high	最大下标
	 * @return
	 */
	public static int doSearchForDiGui(int[] arr,int key,int low,int high){
		if(low > high){
			return -1;
		}
		int middle = (low +high)/2;
		if(key == arr[middle]){
			return middle;
		}else if(key < arr[middle]){
			return doSearchForDiGui(arr,key,low,middle-1);
		}else{
			return doSearchForDiGui(arr,key,middle+1,high);
		}
	}

然后再在main函数中调用,

public static void main(String[] args) {
		int[] array = {1,2,3,4,5,6,7,8,9,10};
		//给定要查找的数据
		int key = 3;
		//执行查找的流程,不使用递归
		//int index = doSearch(array, key);
		//折半查找,采用递归算法
		int index = bianarySearch(array,key);
		//输出结果
		if(index == -1){
			System.out.println("要查找的数据不存在");
		}else{
			System.out.println("数据所在的下标是:" + index);
		}
	}

运行,可以看到要查找的结果是否在我们的数组中

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码农叔叔

谢谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值