二分查找
1.什么是二分查找
二分查找也叫折半查找,是在一组有序(升序/降序)的数据中查找一个元素,它是一种效率较高的查找方法。
2.原理
1.二分查找的数组必须是有序数组。
2.数组里的元素一般为可以比较大小的数值型。
3.将想要查找的目标元素与查找范围内的中间元素进行比较,如果相等,查找结束,反之,把目标元素分到较大或者是较小的范围在进行比较。
4.通过分组可将查找范围缩小一半。
5.重复步骤三,直到目标元素与查找范围内中间元素相等或者没有这个目标元素,查找结束。
6.二分查找的时间复杂度O(log2n)
3.例子
现有一个有序数组arr[]{1,2,3,4,5,6,7,8}
数组有偶数个元素时,当取中间元素,遇到两边数据个数不同时,并不影响我们查找元素,只需要规定是向上或向下取整。
我们规定value是想要查找的目标元素,mid是中间元素的指针,beign是查找范围内第一个元素的指针,end是查找范围内最后一个元素的指针。
第一步,确立mid的指向。
第二步,使mid指向的元素与value的值进行比较。
第三步,找到目标元素。
java代码实现
public static void main(String[] args) {
//定义一个有序的数组
int[] arr = new int[100];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
binarySearch(arr, 40);
}
/***
*
* @param arr
* @param value
* @return 查询的次数
*/
public static int binarySearch(int[] arr,int value) {
System.out.println("****************使用二分法查找****************");
int mid = 0; // 检索的时候
int start = 0; //用start和end两个索引控制它的查询范围
int end = arr.length;
int count = 0;
for (int i = 0; i < arr.length; i++){
count++;
mid = (start + end) / 2;
if(arr.length - 1 == i){
System.out.println("抱歉,没有找到");
}else if (arr[mid] < value){
start = mid;
}else if (arr[mid] > value){
end = mid;
}else{
System.out.println(arr[mid] + "找到了,在数组下标为" + mid + "的地方,查找了" + count + "次。");
break;
}
}
return count;
}