[JAVA]数组的折半查找


其实仔细想想这个知识点并不复杂,也不知道为啥看了这么久。


渐渐发现了一个问题,在课上听课记笔记,下课之后独立写代码依然很吃力。往往恨不得把老师说的话一个字符一个字符的全部记在脑子里。


说简单点,就是不得要领。每当看着笔记自己写的时候,思想总像是断了线的念珠,没办法连接起来。


说点无关的——我似乎需要开始考虑一下自己的学习方法了。


这次的练习是数组中任意元素的查找,查找方式为折半查找。


来看代码:


        public static int getIndex(int[] arr,int key)
	{
		int min=0;
		int max=arr.length-1;
		int mid=(max+min)/2;
			
			while(arr[mid] !=key)//循环条件,key不等于中间角标;
			{
				if(key>arr[mid])//判断,确定折半范围;
					min=mid+1;

				else if (key<arr[mid])
					max=mid-1;
				
				if (min>max)//如果最小角标值大于中间角标(Key不存在);
					 return -1;//返回-1

			mid=(max+min)/2;//循环体,判断完折半范围之后,再查找中间角标;	
			}
	return mid;//返回中间角标;
	}
	public static void main(String[] arg)
	{
		int[] arr={1,3,5,7,10,13,18,32};
		int Index=getIndex(arr,130);

	System.out.println("Index="+Index);
	}

在练习中遇到了一个问题。


第一次编写完之后,编译通过。但运行的时候出现了下面的情况:


[截图1](因为没找到截图软件)


因为课上有讲到这样的现象,光标一直闪烁表示出现了无限循环。不得不按下Ctrl+C来结束程序。

自己思考良久无果,看了老师的代码之后发现问题出现在这一行。


			mid=(max+min)/2;//循环体,判断完折半范围之后,再查找中间角标;	

最开始我是没有写这一行的。

好玩的是,在编译之前我依然在纸上运行了一遍代码,没有发现问题。回想起来才意识到,判断条件结束后再次取中间值这个操作我自己下意识的完成了,但却没有写出来。

所以程序就一直停在while循环里,不停的进行判断,却没有可以执行的循环体。


另外一种情况也可以出现这种现象。

比如这里:

				if (min>max)//如果最小角标值大于中间角标(Key不存在);
					 return -1;//返回-1


如果没有这一句,当key的值不存在于数组中时。对于key的查找就会一直在最大角标和最小角标中徘徊。简单在取中间值的时候会发现key的值即大于前一个角标所对应的值,有小于后一个角标的值。

例如我在数组中找 “9” 这个数,取值就会发现它即大于3角标又小于4角标。最终取值的范围会变成min的值已经大于max的值了,这时候依然没有找到key的话只能说明key不存在于这个数组当中。

所以需要使用这条语句,返回一个“-1”来表明要找的数在数组中不存在。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值