直接上代码:
package binarySearch;
/**
* 二分查找
*/
public class BinarySearch {
static int[] nums = {1,5,8,11,19,22,31,35,40,45,48,49,50};
/*
中间数 31 < 48
left = 35
中间数 45 < 48
left = 48
中间数 49 > 48
right = 48 = left
结果为48
*/
static int target = 48;
public static void main(String[] args) {
System.out.println(binarySearch(nums, target));
}
//简单方法
public static int binarySearch(int[] nums, int target){
int left = 0,right = nums.length - 1,search;
while (left <= right){
search = (left + right) / 2;
//输出一下当前的位置
System.out.println(nums[search]);
if(nums[search] == target){
return search;
} else if (nums[search] < target) {
left = search + 1;
} else if (nums[search] > target) {
right = search - 1;
}
}
return -1;
}
/*
* 缺陷:当数过大时 (left+right)/2;可能会出现整数溢出
* 改进:1. search = left + (right - left)/2
* 2.位移运算 search = (left+right)>>>1 //无符号右移
* 十进制移动小数点会以10倍变换 二进制会以2倍变换
*/
}
位移运算相比除法会更快。