思路很简单,有三个游标:left、mid、right,然后根据key的值与num[mid]的值的比较结果,缩小比较范围。
主要摆出两个代码,一个是right指向最后一个元素的后一个,一个是right指向最后一个元素
- right指向最后一个元素的后一个
1 public static int binarySearch(int[] nums, int key){ 2 if (nums == null){ 3 return -1; 4 } 5 int left = 0; 6 int right = nums.length; 7 8 // right表示的是最后一个元素的后一个 9 while (left<right){ 10 int mid = (left+right)/2; 11 if (key == nums[mid]){ 12 return mid; 13 } 14 if (key > nums[mid]){ 15 left = mid+1; 16 } 17 if (key < nums[mid]){ 18 right = mid; 19 } 20 } 21 22 return -1; 23 }
- right指向最后一个元素
1 public static int binarySearch2(int[] nums, int key){ 2 if (nums==null){ 3 return -1; 4 } 5 6 int left = 0; 7 int right = nums.length-1; 8 9 while (left<=right){ 10 int mid = (left+right)/2; 11 if (key == nums[mid]){ 12 return mid; 13 } 14 if (key > nums[mid]){ 15 left = mid+1; 16 } 17 if (key < nums[mid]){ 18 right = mid-1; 19 } 20 } 21 22 return -1; 23 }
要注意的问题:
left+right可能越界,因此写成mid=left+((right-left)>>1);
判断浮点数时不能用等于,需要写成key-nums[mid]<1e-6 || nums[mid]-key<1e-6;