二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素必须有序排列。
折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
先上代码:
import java.util.Arrays;
public class Demo7 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int num = 4;
int begin = 0;
// end边界必须是arr.length,否则最后一个数可能查找不到
int end = arr.length;
int mid = (end + begin) / 2;
while (true) {
if (num > arr[mid]) {
begin = mid + 1;
mid = (end + begin) / 2;
} else if (num < arr[mid]) {
end = mid - 1;
mid = (end + begin) / 2;
} else {
System.out.println("数字在索引为" + mid + "的位置。");
break;
}
// 此判断条件非常重要
if (mid == arr.length || end < begin){
System.out.println("数字不在数组中。");
break;
}
}
}
}
分析可知,如果要查找的目标数num大于数组最大数,则mid最终会与arr.length相等,如果要查找的目标数num小于数组最小数,则end会小于begin,因为最后end为-1,begin为0。注意千万不要写成mid<0,因为(-1+0)/ 2 = 0,mid会永远等于0,从而不会<0,造成死循环,打印不出“数字不在数组中。”
如果理解什么是二分查找,换查找边界begin和end不难,但要特别注意跳出循环的条件, 否则会造成死循环。