二分查找:在一个有序数组中查找具体的某个数字n。(C语言)-创新互联
方法一:从前往后遍历(最初想法)
注意事项
方法二:二分查找
注意事项
网页名称:二分查找:在一个有序数组中查找具体的某个数字n。(C语言)-创新互联
文章分享:http://azwzsj.com/article/phscj.html
实现代码:
成都创新互联公司主营双流网站建设的网络公司,主营网站建设方案,成都App制作,双流h5小程序设计搭建,双流网站营销推广欢迎双流等地区企业咨询#includeint main()
{
int arr[] = { 0,11,22,33,44,55,66,77,88,99 };//假设的有序数列
// 元素位置: 0 1 2 3 4 5 6 7 8 9
int n = 0;//n是要查找的数字
scanf("%d", &n);
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int flag = 0;
for (i = 0; i< sz; i++)
{
if (n == arr[i])
{
flag = 1;
printf("找到了,下标是:%d\n", i);
break;//如果找到了这个数,便跳出循环
}
}
if (flag == 0)//上面循环从前往后遍历了所有数组的值还没有找到,便说明找不到
printf("找不到\n");
return 0;
}
注意事项
第9行 int sz = sizeof(arr) / sizeof(arr[0]); //定义sz获得元素个数40/4=10
第10行 int flag = 0; //定义flag为判断是否能找到该数组元素的标志
编译运行后可以实现此题要求,但是——
显然此代码遍历了数组的所有值,工程较复杂,于是为了简化程序运行时间,采用二分查找。
方法二:二分查找
实现代码1:
#includeint main()
{
int arr[] = { 0,11,22,33,44,55,66,77,88,99 };//假设的有序数列(从下到大排列)
// 元素位置: 0 1 2 3 4 5 6 7 8 9
int k = 0;//k是要查找的数字
scanf("%d", &k);
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
//折半查找(二分查找),前提是数组有序(切记)
int left = 0;
int right = sz - 1;
int flag = 0;
while (left<=right)//=不能忘掉
{
//int mid = (left + right) / 2;(可能导致整型越界问题,故做下面的优化)
int mid = left + (right - left) / 2;//找到中间数
if (arr[mid]< k)//这个数比中间数大
{
left = mid + 1;//则在右半查找
}
else if (arr[mid] >k)//这个数比中间数小
{
right = mid - 1;//则在左半查找
}
else
{
printf("找到了,下标是:%d\n", mid);
flag = 1;
break;//找到该数便跳出循环
}
}
if (flag == 0)
printf("找不到\n");//上述循环查找完还没找到,便说明此数不在给定的有序数列中
return 0;
}
注意事项
二分查找,前提一定是是数组有序(切记)。
第14行 while (left<=right) 中的=不能忘记加,因为可能出现循环一直二分查找到最后只剩一个元素=被查找元素的情况
第16行注意:int mid = (left + right) / 2;是不可行的做法,因为如果考虑left和right都接近int型的大值的话,两数加起来就超越了int型的规定范围导致越界,这样的数除以2就不是他们两个的平均值了,故优化代码为int mid = left + (right - left) / 2;这样不会出现越界问题。
实现代码2(补充函数实现):
#includeint binary_search(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;
}
}
return -1;
}
int main()
{
int arr[] = { 10,22,33,44,55,66,77,88,99 };
int k = 0;
scanf("%d", &k);
int sz = sizeof(arr) / sizeof(arr[0]);
//找到了就返回下标,找不到就返回-1
int ret = binary_search(arr, k, sz);
if (ret == -1)
printf("找不到\n");
else
printf("找到了,下标是:%d\n", ret);
return 0;
}
以上便是这道题我的全部思路了,大家看完觉得对自己有帮助的话,麻烦文章末尾点点赞,以后我会更加努力更新各种题的求解思路,另外如果觉得有不懂的地方和更好的求解方法也可以评论区指出来,大家一起学习进步~~
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页名称:二分查找:在一个有序数组中查找具体的某个数字n。(C语言)-创新互联
文章分享:http://azwzsj.com/article/phscj.html