一、题目
假设有一个数组 { 12, 23, 34, 45, 56, 67, 77, 89, 90 },现要求采用二分法找出指定的数值并将其在数组的索引返回,若没有找到则返回 -1。
二、实验代码
package fighting;
import java.util.Arrays;
public class fighting
{
static int search(int[] a,int value)
{
int low=0;//指针low表示待查元素所在范围的下界,下界索引从0开始,则上界应为数组的长度减去1
int high=a.length-1;//指针high表示待查元素所在范围的上界
while(low<=high)
{
int mid=(low+high)/2;//指针mid表示中间位置,且是向下取整
if(a[mid]==value)//若中间位置值等于我们所需要查找值,即返回中间值
{
return mid;
}
if(a[mid]<value)//若中间位置值小于我们所需查找值,则在后半段中查找,即将下界值变为mid+1,上界值不变
{
low=mid+1;
}
else若中间位置值大于我们所需查找值,则在前半段中查找,即将上界值变为mid-1,下界值不变
{
high=mid-1;
}
}
return -1;//若查找不到我们所需要值,即返回-1
}
public static void main(String[] args)
{
int[] a= {12,34,56,78,90,24,67,43,75,20,89,98};
Arrays.sort(a);//采用二分法查找时,数据需是有序不重复的,需要对该数组进行排序
System.out.println(Arrays.toString(a));//Arrays.toString()打印数组
System.out.println(search(a,34));//3
System.out.println(search(a,67));//6
System.out.println(search(a,99));//-1
}
}
三、运行结果
四、实验总结
1、二分法查找,又称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。算法思想为:从数组中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组已经为空,则表示找不到指定的元素。二分法查找每次是使查找范围缩小一半,其时间复杂度是O(log(n));下面给出该查找的过程实例:
2、将数组中的内容打印出来,直接使用toString方法只会打印出数组的地址,需要使用Arrays的toString方法打印出格式的数组。
int[] a= {12, 20, 24, 34, 43, 56, 67, 75, 78, 89, 90, 98};
System.out.println(Arrays.toString(a));//[12, 20, 24, 34, 43, 56, 67, 75, 78, 89, 90, 98]
System.out.println(a.toString());//[I@2ff4acd0 该数组a的地址