Java初学者进阶——binary search(二分查找)

Java初学者进阶——binary search(二分查找)

和bubblesort(冒泡排序)一样,binary search(二分查找)也是基本上各大公司笔试的内容,要求手写代码。单单会背会写远远不够,更重要的是掌握其原理性。下文中我将仔细讲解bubblesort的原理,并代码实现,如文中有不足和错谬之处,还望各位不吝赐教。

binary search是在一个有序排列的数组中查找指定数据的下标并输出,普通的查找方法通过遍历数组,找出对应数据。但是针对数组长度较长或者非常长的情况下,这个从头遍历查找的方法效率就显得十分低下,这时候二分查找的优势就显现出来了。二分查找,意味着从中间开始进行比较,因为数组是有序排列的(一般从小到大);所以就可以从数组的中间比较。具体的原理我在下文中举例说明。

为了方便理解,我假定我们需要查找的数组为:
int[] arr1={1,2,3,4,5,6,7};
查找的6的下标。

数组的下标排序从0-6;

第一步
查找最中间的数据arr1[3]是否与被查找的数据相匹配,中间的数为4,4小于被查找的数 6,因为数据有序排列,所以现在可以将查找范围缩小,从4的下标找到7的下标,也就是从arr[3]找到arr[6];现在又重复之前的步骤,从新范围的中间开始查找,直到找出最后的结果。

普通的遍历数组找法,循环需要运行6次
而二分查找循环仅仅需要运行3次。

下面通过代码实现,代码中有详细注解,如果有误或者不解之处,请联系。

class BinarySearch{
	public static void main(String[] args){
		//创建一个有序数组
		int[] arr1={1,2,3,4,5,6,7};
		//调用binarySearch方法,传入参数  arr1,6
		binarySearch(arr1,6);
        }
        static void binarySearch(int[] arr,int a){
        	//定义数组的起点下标和终点下标
             int min=0,max=arr.length-1;
             /**
              *定义数组的中间数据的下标,接收的类型为int 
              *所以当数据长度为偶数时不影响实际循环
              */
             int centre=(min+max)/2;
             //使用while循环,不知道具体的循环次数所以for循环不适用
             while(min<=max){
             	//第一种,在中间的数字就是需要查找的数,直接跳出循环
				if(arr[centre]==a){
			        System.out.println(centre);
			        break;
			    //当中间的数大于查找数,将中间数据的下标减1 赋给 最大下标
			    }if(arr[centre]>a){
			        max=centre-1;
			    //当中间的数小于查找数,将中间数据的下标加1 赋给 最小下标
			    }else{
			         min=centre+1;
			    }
			    //完成新的赋值之后,再将完成新的赋值的下标的平均值赋值给中间下标
                centre=(min+max)/2;
             }
       }
}

你可能感兴趣的:(Java初学者进阶——binary search(二分查找))