目录
左闭右闭的写法
更新边界
中间值>目标值,说明左边的界限是正常的,考虑要缩小右边的界限,以便再次更新中间值去和目标值进行判断。
边界界限范围
由于是 左闭右闭 的范围,中间值已经取到左右两边的值,所以在更新左右两边的时候要避开两边的值,左边就+1,右边就-1;(对于左闭右开,右边已经取不到值,所以在更新的时候可以直接用右边界的值,不用+1,-1)
#include <stdio.h> | ||
4 | int jkl(int arr[], int left, int right, int target) | |
5 | { | |
6 | while (left <= right) //左闭右闭 | |
7 | { | |
8 | int mid = (left + right) / 2; | |
9 | if (arr[mid] == target) | |
10 | { | |
11 | return mid; | |
12 | } | |
13 | else if (arr[mid] < target) | |
14 | { | |
15 | left = mid + 1; //因为初始的用到了,更新的应该是下一个位置的地方 | |
16 | } | |
17 | else | |
18 | { | |
19 | right = mid - 1; | |
20 | } | |
21 | } | |
22 | return -1; |
int main() | ||
47 | { | |
48 | int arr[] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; | |
49 | int target = 7; | |
50 | int n = sizeof(arr) / sizeof(arr[0]); | |
51 | int result = jkl(arr, 0, n - 1, target); | |
52 | if (result != -1) | |
53 | { | |
54 | printf("数字 %d 所在的下标为 %d\n", target, result); | |
55 | } | |
56 | else | |
57 | { | |
58 | printf("找不到\n"); | |
59 | } | |
60 | return 0; | |
61 | } |
左闭右开的写法
int jkl(int arr[], int left, int right, int target) | ||
26 | { | |
27 | while (left < right) //左闭右开,因为取不到这个右边所以不等于 | |
28 | { | |
29 | int mid = (left + right) 2; | |
30 | if (arr[mid] == target) | |
31 | { | |
32 | return mid; | |
33 | } | |
34 | else if (arr[mid] < target) | |
35 | { | |
36 | left = mid + 1; //因为初始的用到了,更新的应该是下一个位置的地方 | |
37 | } | |
38 | else | |
39 | { | |
40 | right = mid; | |
41 | } | |
42 | } | |
43 | return -1; | |
44 | } |