Java实现二分法查找

笔者前几日荒废了学习,深感不安,故今日连续编码并整理发文,都是简单的东东,希望有能用得到的人!下面是个人总结,用语可能不够严谨,仅供参考!

二分排序法:

1.适用场景-->有序列

2.思想-->
   每次取中间的数同目标数做比较,比目标数大,则需要向左边递归;比目标数小,则向右边递归;如果相等,则不执行递归,因为找到了目标元素;
3.实现-->
   a.初始化递归应该包含左右边界,目标数,被查找序列四个入参;
   b.取中间数,同目标数比较:
      -->比目标数大,向左递归,左边界不变,右边界变为midIndex-1;
      -->比目标数小,向右递归,右边界不变,左边界变为midIndex+1;
      -->相等,不递归,直接输出目标数位置;
   c.最重要的是,保证递归不死循环,要在b步骤的外层,加一个大的判断条件,即入参rightIndex>=leftIndex ;

 

特此说明:

此段代码用到笔者前些日的《Java实现排序》中的插入法排序类中的方法,因为二分法查找只适用有序列;

读者如想简单使用的话,可以直接初始化一个有序列,在主函数中直接调用bf.finding(0,length-1,val,arr)即可。

 

 

/**
 * 演示二分法查找,调用Insertion类的排序方法
 * Created by Light on 2014-7-27
 */
package com.second;
public class DoFinding {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//初始化数组
		int arr[] = {0,9,3,5,2,7,6,4,1,8};
		//int arr[] = {0,1,2,3,4,5,6,7,8,9};
		//int arr[] = new int[0];
		//int arr[] = new int[10];
		//初始化数组,使用for循环
		/*
		for(int i=0;i<arr.length;i++)
		{
			arr[i] = (int)Math.random()*10;
		}*/
		
		//查找5
		BinaryFind bf = new BinaryFind();
		bf.actionFinding(arr, 5);
		//bf.finding(0, 9, 7, arr);

	}

}

//BinaryFind
class BinaryFind
{
	public void finding(int leftIndex,int rightIndex,int val,int arr[])
	{
		//取中间数
		int midIndex = (leftIndex + rightIndex)/2;
		int midVal = arr[midIndex];
		//comparsion
		if(leftIndex<=rightIndex)
		{
			if(midVal>val)
			{
				finding(leftIndex,midIndex-1,val,arr);
			}else if(midVal<val) {
				finding(midIndex+1,rightIndex,val,arr);
			}else if(midVal==val){
				System.out.println("目标已找到,其下标为:"+midIndex+".给力吧!");
			}
		}else{
			//在一次递归完成后,先判断一下是否会进入下一次递归,即leftIndex<=rightIndex是否为真,如果为假,则打印出查无此数.
			System.out.println("查无此数!别浪费我感情!");
		}
		
	}
	
	//外层封装
	public void actionFinding(int arr[],int val)
	{
		if(arr.length-1>=0)
		{
			//先排序
			Insertion ins = new Insertion();
			ins.sort(arr);
			ins.showArray(arr);
			//再查找
			finding(0,arr.length-1,val,arr);
		}else{
			System.out.println("此数组为空,无法查找!老大,你逗我呢?!");
		}
	}
}









 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值