记录今日写到吐血的用函数来写二分法
注意的点:
数组arr传递给函数参数的时候其实是数组的首元素地址,而地址是申请了4个字节来存放,除以每个函数的四个字节,就会为1,而二分法中的right永远都会等于1-1=0;会有错误。
这时就要先创造一个变量来在函数外部存放整个有序数组的长度,生成参数再传进去
先来看看本人的错误写法(吐血)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
_er_fen(int xiabiao,int k)
{
int left = 0;
int right = k - 1;
while (1)
{
int mid = (left + right) / 2;
if ((mid + 1) < xiabiao)
{
left = mid + 1;
}
else if ((mid + 1) > xiabiao)
{
right = mid - 1;
}
else if((mid+1)==xiabiao)
{
printf("找到啦,这个数字的下标是%d\n",(mid+1));
break;
}
if (left == right)
{
printf("找到啦,这个数字的下标是0");
break;
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int num = 0;
int k = sizeof(arr) / sizeof(arr[0]);
scanf("%d", &num);
int j = num - 1;
_er_fen(j,k);
return 0;
}
错误原因:
而真正的做法是利用传址来联系自定义函数与主函数之间的联系:
而且注意:
这里的传地址,也是可以用arr[]的!!!!就因为传的是地址,所以才可以从外部和函数之间的参数给串起来共同使用!!!才可以用下标来引出arr里面的元素!!!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int _er_fen(int arr[], int num, int k)
{
int left = 0;
int right = k - 1;
int mid = 0;
while (1)
{
mid = (left + right) / 2;
if (arr[mid] < k)
{
left = mid + 1;
}
if (arr[mid] > k)
{
right = mid - 1;
}
if (arr[mid] == k)
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int num = 0;
int k = sizeof(arr) / sizeof(arr[0]);
scanf("%d", &num);
int m=_er_fen(arr,num,k);
if (m == 1)
{
printf("找到了,其下标为%d\n", m);
}
if (m == -1)
{
printf("找不到");
}
return 0;
}
总结: