使用二分查找法比线性查找法快得多。线性查找算法是线性的时间复杂度O(n),二分查找法每比较一回就将数据缩减一半。最好的情形是第一次比较就查找到元素,也就是说元素刚好位于数组的中点。最坏的情况是元素刚好不在数组中,这种情况下在删除所有元素前我们不得不进行大约次比较具有时间复杂度O(),因此当n较大时使用二分算法查找元素效率更高。
二分法通过先假设查找元素在数组中,然后与中间元素进行比较,如果大于中间元素,则元素处于中间元素的左侧(默认数组中元素,从小到大,从左到右顺序排列),那么排除掉包括中间元素和其右侧的元素。同时得到新的要查找的范围,即(middle+1)~(end)。如果小于中间元素,则证明目标元素可能出现在中间元素的右侧,则得到新的查找范围(start)~(middle-1)。对中间元素+1或-1是因为已经比较过中间元素了,所以锁定查找范围时要排除中间元素。
public class Searching {
/**
*
* @param arr 传入目标数组
* @param num 目标元素
* @param start 起始坐标
* @param end 结束坐标
* @return 元素是否存在于数组
*/
public static boolean search(int[] arr,int num,int start,int end) {
boolean flag = false;
int middle = (start + end) / 2;
if (start <= end) {//防止数组越界
/**
* 如果目标元素等于中间元素则返回,否则继续迭代
*/
if (num > arr[middle]) {
flag = search(arr, num,start+1,end);
} else if (num < arr[middle]) {
flag = search(arr, num,start,end-1);
} else {
flag = true;
}
}else {
System.out.println("数组中没有此值");
}
return flag;
}
public static void main(String[] args) {
int[] arr = {-1, 2, 3, 4, 5,6};
boolean result = search(arr, 6, 0, arr.length-1);
System.out.println(result);
}
}