#include <stdio.h>
int erfen(int arr[], int k, int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
else if (arr[mid] > k)
{
right = mid - 1;
}
else
{
return mid;
}
}
if (left > right)
{
return -1;
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
int k = 0 ;
scanf("%d", &k);
int ret = erfen(arr, k, sz);
if (ret == -1)
{
printf("找不到");
}
else
{
printf("找到了,下标是:%d", ret);
}
return 0;//二分查找
}
1.第二行中,函数参数部分的中int arr[ ] 不是整形参数,而是指针变量的参数,代表着将arr数组的首位元素的地址传给参数,因为数组的元素内存地址是连续的,只要将首位元素的地址传给函数,便将数组的地址传给了函数。
2.mid的表示方式有俩种,一种是mid = (left + right)/2,另一种是 mid = left + (right-left)/2,后者的优点是可以防止数值太大溢出。
3.int mid = ...... 放在循环里面的原因是mid每次循环都需要重新取值,若放在外面,mid的值会跟不上循环。
4.情况“找不到”对应的返回值不要取元素下标对应的数字,否则不知道是找不到还是找到了下标为相应返回值的元素。这里取值是-1。
5.sz的存储不要放在函数内部,因为sizeof(arr)/sizeof(arr[0])在主函数中arr指数组本身,在此函数中arr是指针变量,存储着arr的地址,sizeof(arr)此时是一个指针变量的大小,若为x64,则为8,若为x86,则为4。