折半查找是对于一组有序排列的数字进行的查找。其思想是取该组数中间位置的数(设每个中间的数位a)与目标数(设目标数为b)进行比较,如果目标数b大于中间位置数a,则取b与a前面数比较,同时运用上述方法,与a前面数取中间为数a1进行比较,如此这样缩小范围,若b小于a,与上同理。直到确定该目标数为止。
附上代码:
public class HalfSearch
{
public static void main (String[] args)
{
int[] arr=new int[]{2,3,5,6,34,5656};
int a=HalfSearch_2(arr,6);
System.out.println(a);
}
private static int GetIndex(int[] arr,int key)//此方法为普通查找,取目标数一一与该数组里的数进行比较,直到第一次找到该数即停止,输出位置
{
for(int a=0;a<arr.length;a++)
{
if(arr[a]==key)
{
return a;
}
}
return -1;
}
private static int HalfSearch(int[] arr,int key)
{
int min,max,mid;
min=0;
max=arr.length-1;//max不能等于数组长度,否则下标越界
mid=(min+max)/2;
while(key!=arr[mid])
{
if(key>arr[mid])
{
min=mid+1;//若该数大于中间数,则取中间数后一位数为最小数,原数组最大数为最大数,再进行比较
}else if(key<arr[mid])//若该数小于中间数,则取中间数前一位数为最大数,原数组最小数为最小数,再进行比较
{
max=mid-1;
}if(mid>max)//若mid>max则该数不存在于此数组中
{
return -1;
}
mid=(max+min)/2;
}
return mid;
}
private static int HalfSearch_2(int[] arr,int key)
{
int min,mid,max;
min=0;
max=arr.length-1;
mid=(min+max)/2;
while(min<=max)
{
mid=(min+max)/2;
if(key>arr[mid])
{
min=mid+1;
}else if(key<arr[mid])
{
max=mid-1;
}
else
{
return mid;
}
}
return -1;
}
}
|