二分查找的过程(成功案例)
下面的图来源于 中国大学mooc-浙大数据结构
要找的数比中间值大,往右找
还是大,继续往左
left=mid(10)+ 1 //11
right = 13不变
mid=(left+right)/2
下面是找不到数据的案例
当left>right时,说明找不到数据
比中间值小,往左
比中间值大,往右
比中间值小,往左
最后left>right 越界了,说明找不到数据
最后上代码:
package 数据结构;
public class binarySearch
{
/*
* 二分查找的前提:查找数据源必须是有序的!!!
*/
private int [] arr ;
private int left ;//记录数组左边的下标
private int mid ;//记录left->right范围的中间值,此下标所对应的值就是当前要比较的值
private int right ;//记录数组右边的下标(left--->right 确定查找的范围)
public binarySearch ( int [] arr )
{
//从外界接受一个数组
this.arr = arr ;
//确定初次查找时的范围
left = 0 ;
right = arr.length - 1;//arr.length 表示数组长度,而并非数组下标所以-1
}
//二分查找
public int search ( int data )
{
while ( left <= right )
{
mid = (left + right) / 2 ;//计算中间元素的坐标
//如果中间值比要查找的数据小,说明要找的数据在数组的右边
if ( arr [mid] < data )
{
left = mid + 1 ;
}
//如果中间值比要找的数据大,说明要找的数据在数组的左边
else if ( arr [mid] > data )
{
right = mid - 1 ;
}
//查找成功
else
{
//返回要找的数据所对应的数组下标
return mid ;
}
}
//跳出循环说明right比left小,越界了就没找到
return -1 ;
}
//遍历
public void display ()
{
for ( int i = 0 ; i < arr.length ; ++ i )
{
System.out.print ( arr[i] + " ");
}
System.out.println ();//换行
}
}