前言
二分法查一个数
编写代码在一个整形有序数组中查找具体的某个数
要求:找到了就打印数字所在的下标,找不到则输出:找不到。
一、思路
设数组的第一个值下标为left,最后一个值下标为right;
假设left和right的中间值为mid = left+(right-left)/2
设置一个循环,判断mid对应的数是否等于所查找的数input
若arr[mid]不等于input就判断arr[mid]和input的关系
①arr[mid]>input时:left不变,让right = mid;
②arr[mid]<input时:right不变,让left = mid;
一直循环直到出现两种情况结束:
①当left>right时,输出找不到
②当arr[mid] == input时,输出mid所对应的数组元素的小标
二、源代码以及运行截图
为了方便大家的交流和学习,我将程序源代码和运行截图放置在下方。
源代码:
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9 }; int left = 0; int right = sizeof(arr)/sizeof(arr[0])-1;//计算数组的元素个数,但是由于数组下标由0开始,所以-1得到数组最后一位元素的下标 //要注意的是,如果这个部分int right = sizeof(arr)/sizeof(arr[0]),也就是没有减一的情况, //相应的下面循环部分的条件就要改为left<right, //因为这种写法的right是数组最后一个元素的下一个int类型数据的下标,也就是出现了越界访问,这时的left就不可能出现等于right这种情况。 int mid = 0; int input = 0; printf("请输入您要查找的数字:>"); scanf("%d", &input); while (left <= right)//当right = left时mid也有可能等于input所以要用<= { mid = left + (right - left) / 2;//用left+(right-left)/2,而不用(left+right)/2是担心后者(right+left)的值过大超过了整形的取值范围造成溢出,使结果不准确 if (arr[mid] == input) { printf("找到了,下标为%d\n", mid); break; } if (arr[mid] > input)//input<arrr[mid]说明input在mid的左侧,所以将right = mid继续在左侧进行寻找。 { right = mid; } if (arr[mid] < input)//input>arrr[mid]说明input在mid的右侧,所以将left = mid继续在右侧进行寻找。 { left = mid; } } return 0; }
运行截图:
总结
以上就是今天要讲的内容,本文简单的介绍了用C语言在一个有序整数数组中用二分查找法查找一个数返回它的下标的思路,还进一步展示了代码的运行结果验证了作者的思路。
本文的作者也只是一个正在学习C语言等编程知识的萌新,若这篇文章中有哪些不正确的内容,请在评论区向作者指出(也可以私信作者),欢迎大佬们指点,也欢迎其他正在学习C语言的萌新和作者进行交流。
最后,如果本篇文章对你有所启发的话,也希望可以支持支持作者,后续作者也会定期更新学习记录。谢谢大家!