数据结构与算法(java)《二分查找》
-
基本二分查找 public class BinarySearch { /** * 1.定义一个有序数组, * 2.定义两个变量i,j * 3.定义一个待查找的数 * 4.查到返回索引的值,查不到返回-1 */ public static int binarySearchBasic(int[] a,int target) { //定义两个指针,i指向头指针,j指向尾指针 int i = 0; int j =a.length-1; //进行判断循环 while (i<=j){ int m=(i+j)/2; //向下取整,int类型会自动取整,有漏洞,建议使用右移 if (a[m]<target){ i=m+1;//在目标左边 }else if (a[m]>target){ j=m-1;//在目标右边 }else{ return m; //找到了,返回索引 } } return -1;//没有找到 } //测试 public static void main(String[] args) { //定义一个数组 int[] i={7,13,21,30,38,44,52,53}; int target =21; int searchBasic = binarySearchBasic(i, target); System.out.println(searchBasic); }
2.改动版二分查找
public static int binarySearchBasic1(int[] a,int target) { //定义两个指针,i指向头指针 int i = 0; int j =a.length; //此时的j不指向队尾,不参与比较,只是定义一个范围 //进行判断循环 while (i<j){ int m=(i+j)/2; //向下取整,int类型会自动取整,有漏洞,建议使用右移 if (a[m]<target){ i=m+1;//在目标左边 }else if (a[m]>target){ j=m;//在目标右边 }else{ return m; //找到了,返回索引 } } return -1;//没有找到 }
3.遇到的问题:
3.1 为什么是i<=j而不是i<j?
答:i==j意味着i,j它们指向的元素也会参与比较。
3.2 (i+j)/2有没有问题?
int maxValue = Integer.MAX_VALUE-1;
int i1=0;
int m=(maxValue+i1)/2;
System.out.println(m);//此时的值为1073741823
int i2 = (m + maxValue)/2;
System.out.println(i2);//此时的值为负数,不符合要求
因为Java有符号数,第一个二进制数为1的话,表示为负,建议使用右移:m=(i+j)>>>1;