二分查找:(一点补充,数组最左边记为left,最右边记为right,中间值为(left + right) / 2,记为mid)
在数组中找到一个中间值,拿这个中间值与要找的数比较,此时有三种情况,
- 中间值比要找的数小,则left=mid+1,right不变
- 中间值比要找的数大,则right=mid-1,left不变
- 中间值就等于要找的数,此时直接return即可
- 注意:left<=right,不然left与right的位置会交换,数就找不到了
图片思路:
代码实现:
//写一个整形有序数组的二分查找 #include<stdio.h> int Binary_search(int arr[], int k, int sz) { int left = 0; int right = sz - 1; while (left <= right) { int mid = (left + right) / 2;//因为left / right 一直在变,所以 mid在循环里面 if (k > arr[mid]) { left = mid + 1; } else if (k < arr[mid]) { right = mid - 1; } else { return mid; } } return -1; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,0 }; int sz = sizeof(arr) / sizeof(arr[0]);//计算数组个数 int k = 7;//要找的数 int ret = Binary_search(arr, k, sz); if (-1 == ret) { printf("找不到"); } else { printf("找到了,下标是 %d ", ret); } return 0; }
代码结果: