其实仔细想想这个知识点并不复杂,也不知道为啥看了这么久。
渐渐发现了一个问题,在课上听课记笔记,下课之后独立写代码依然很吃力。往往恨不得把老师说的话一个字符一个字符的全部记在脑子里。
说简单点,就是不得要领。每当看着笔记自己写的时候,思想总像是断了线的念珠,没办法连接起来。
说点无关的——我似乎需要开始考虑一下自己的学习方法了。
这次的练习是数组中任意元素的查找,查找方式为折半查找。
来看代码:
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”来表明要找的数在数组中不存在。