public class _05折半查找 {
public static void main(String[] args) {
int[] arr1={3,2,1,5,4,9};
int index = getIndex(arr1,4);
//使用折半查找
int[] arr2={3,5,49,57,77,99,101};
int index2 = halfSerch(arr2,45);
System.out.println("index="+index);
System.out.print("index="+index2);
}
//使用折半方法查找:可以提高效率,但必须是有序数组
//思路:1.是否有返回值(有)2.方法的参数类型及个数
//3.定义折半查找的条件:最小角标值,最大角标值,中间值
//4.判断条件:所查找的数是否存在
public static int halfSerch(int[] arr2,int key)//key代表要查找的数值
{
int min,max,mid;
min=0;//最小角标,即从0开始
max=arr2.length-1;//获取最大数的角标,即int[]arr = {3,5,2,1}所在角标的数值
mid=(min+max)/2;//取最小角标与最大角标的中间值
//判断条件:即arr2[mid]中间值所在角标与所要找的数是否相等
while(arr2[mid]!=key)
{
if(key>arr2[mid])
{
min = mid+1;//如果查找数比中间角标所在数的值大,最小角标将从当前角标值右移1位
}else if(key<arr2[mid])
max = mid-1;//如果查找数比中间角标所在数的值小,最大角标将从当前角标值左移1位
if(min>max)//当最小角标大于最大角标时,即没有找到所查数
{
return -1;
}
mid = (min+max)/2;//如果上面判断条件成立,即重新定义中间角标值。
}
return mid;//如果以上条件都不成立,说明已经找着了,即将中间角标返回
}
/*
* 折半的第二种方式
*/
public static int Serch(int[] arr,int key)
{
int min=0,max=arr.length-1,mid;
while(min<=max)
{
mid=(min+max)<<1;//相当于除2
if(key>arr[mid])
min = mid +1;//key大于中间值时,最小值往右,mid+1;
else if(key<arr[mid])
max = mid-1;//key小于中间值时,最大值往左,mid-1;
else
return mid;//找着了
}
return -1;//没找着
}
//功能:获取key第一次出现在数组中的位置。如果返回值是-1,那么代表该key不存在
//思想:1.该功能有没有返回值 (有)2.表达式类型,(数组和要查找的数)
public static int getIndex(int[] arr1,int key)//key代表要查找的数值
{
for(int i=0;i<arr1.length;i++)
{
if(arr1[i]==key)
{
return i;
}
}
return -1;
}
}