二分查找的条件:数组有序
二分法的查找思想是将数组一分为二,将要查找的值与中间值进行比较。如果被查找的值存在,它应该等于中间值。
在数组中查找35,代码为
class Variable{
public static void main(String[] args) {
int[] arr = new int[] {-98,-32,2,34,45,56,67,105,210,333};
int find = 35;
int head = 0;
int end = arr.length-1;
boolean isFlag = true;
while(head<=end) {
int middle = (head+end)/2;
if (find == arr[middle]) {
System.out.print("找到了:"+find);
isFlag = false;
break;
}else if(find<arr[middle]) {
end = middle-1;
}else {
head = middle+1;
}
}
if(isFlag) {
System.out.print("找不到查找的数字");
}
}
}
其中值得注意的地方是当被查找值小于中间值时,下一轮查找end = middle-1而不是end=middle;当被查找值大于中间值时,下一轮查找的head = middle+1,而不是head=middle。
在java中int类型相除也为Int类型,且是向下取整。如果结果为3.5,会变成3.当区间只有2个数的话,会出现死循环,一直运行没有结果
错误代码:
class Variable{
public static void main(String[] args) {
int[] arr = new int[] {-98,-32,2,34,45,56,67,105,210,333};
int find = 35;
int head = 0;
int end = arr.length-1;
boolean isFlag = true;
while(head<=end) {
int middle = (head+end)/2;
if (find == arr[middle]) {
System.out.print("找到了:"+find);
isFlag = false;
break;
}else if(find<arr[middle]) {
end = middle;
}else {
head = middle;
}
}
if(isFlag) {
System.out.print("找不到查找的数字");
}
}
}