二分查找的概念
在计算机科学,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法,搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半
应用二分查找的条件
数据应该
- 存储在数组中
- 有序排列
问题1:为什么要存储在数组中?
问题2:为什么要有序排列?
二分查找的算法的实现
import java.util.Arrays;
public class BinarySearch {
public static void main(String[] args) {
int a[]={1,7,3,8,9,12,6,15,17};
Arrays.sort(a);
for (int b : a) {
System.out.print(b+" ");
}
System.out.println();
System.out.println(search(15,a));
}
public static int search(int key,int[] a){
int lo = 0;
int hi = a.length - 1;
while (lo <= hi) {
// Key is in a[lo..hi] or not present.
int mid = lo + (hi - lo) / 2;
if(key < a[mid]){
hi = mid - 1;
}
else if (key > a[mid]) {
lo = mid + 1;
}
else return mid;
}
return -1;
}
}
问题1:可以在链表上实现,但是链表的随机访问效率很低,所以需要数组。
问题2:有序可以使每次比较后范围缩小一半,查找速度快
二分查找过程描述
查找的数为15,把数组排序后:
1 3 6 7 8 9 12 15 17
第1次:lo=0,hi=8,mid=4,a[mid]=8
第2次:lo=5,hi=8,mid=4,a[mid]=12
第3次:返回mid
3次可以把数找出来
网友评论