一、什么是二分查找?
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法要求:1、必须采用顺序存储结构;2、必须按关键字大小有序排列。
时间复杂度:O(h)=O(log2n)
二、二分查找的Java实现
public class BinarySearch {
public static void main(String[] args) {
int[] arrays = new int[]{1,2,3,4,6,6,7,7,8,9,10};
int target = 7;
System.out.println(search(arrays, target, 0, arrays.length));
}
public static String search(int[] arrays, int target, int head, int tail) {
int center = (head + tail) / 2;
if (center < 0 || center > arrays.length - 1) {
return "No result.";
}
if (target == arrays[center]) {
String rst = "Result location = " + (center + 1);// 结果1
// BEGIN-结果1前后是否有相等的结果
int index = center;
do {
if(target == arrays[--index]) {
rst += ", " + (index + 1);
} else {
break;
}
} while(index >= head);
do {
if(target == arrays[++center]) {
rst += ", " + (center + 1);
} else {
break;
}
} while(center <= tail);
// END-结果1前后是否有相等的结果
return rst;
} else if (target < arrays[center]) {
return search(arrays, target, head, center - 1);
} else if (target > arrays[center]) {
return search(arrays, target, center + 1, tail);
} else {
return "No result.";
}
}
}
说明:上面代码有10几行在处理一种特殊情况,就是当有重复元素存在时,找到第一个结果后,需要在结果的前后继续找一下,这个可以根据具体题目要求来作答,如果数组中没有重复元素,那就可以直接忽略这一步了。