二分查找

来源:互联网 发布:网易 魔兽对战平台 mac 编辑:程序博客网 时间:2024/05/17 22:12

二分查找的过程(成功案例)

下面的图来源于 中国大学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 ();//换行}}