定义一个长度为100的int型数组,数组中前n(n>=1&&n<=100)个元素已经从小到大有序排列。输入一个整数x,使用二分查找法在该数组中查找和x相等的元素。如果在数组中找到,输出找到的第一个元素的下标;否则,输出“Not Found”。
2条回答 默认 最新
关注 望采纳,谢谢,代码:
#include<stdio.h> int brnary_search(int arr[], int k, int sz)//int 这个函数返回整数,注:(int arr[]接收实参数组的第一个元素地址),数组传参数不会把这个数组全部传上去,而是把数组元素首个地址传上去。 { int left = 0;//数组的左下标 int light = sz - 1;//数组的右下标,因为sz代表数组元素的个数,因为数组下标从0开始,使用最右下标应该-1; while (left <= light)//循环条件左下标必须小于或等于才能进入循环。 { int mid = (left + light) / 2;//每次求中间的下标 if (arr[mid] < k)//判断中间下标对应的元素值小于查找k的值。 { left = mid + 1;//中间下标+1,为下次循环left的值 } else if (arr[mid] > k)//判断中间下标对应的元素值大于查找k的值 { light = mid - 1;//上面判断所查找的值小,所以新的范围应该在左边,左边下标不变,右边下标为中间下标-1; } else { return mid;//查找的值与数组值相等,返回数组下标, } } return -1;//当查找左下标超过右下标,代表查询整数不在数组范围内,返回-1; } //排序函数 void reserve(int x[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { //一共n个元素,则需要比较n-1次 for (j = 0; j < n - 1 - i; j++) { //每一个元素需要比较的次数 if (x[i] < x[i + j + 1]) { temp = x[i]; x[i] = x[i + j + 1]; x[i + j + 1] = temp; } } } } int main() { int arr[] = { 1,87,54,56,76,675,43,2,3,4,5,6,7,8,9,10 };//定义数组 int k = 0; int n = 10; //对前n个进行排序 reserve(arr, 10); printf("请输入想查找的整数:"); scanf("%d", &k);//从键盘获取要查找的整数 //int sz = sizeof(arr) / sizeof(arr[0]);//求出数组里元素的个数。 int ret = brnary_search(arr, k, n);//创建ret 变量来接收查找返回值()里的元素代表要传的实参数。 if (-1 == ret)//判断返回值是否等于-1; { printf("Not Found"); } else { printf("找到了,下标为:%d\n", ret);//定义函数返回的数组下标。 } return 0; }
效果:
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
- ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
- ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
- ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
- ¥20 腾讯企业邮箱邮件可以恢复么
- ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
- ¥15 错误 LNK2001 无法解析的外部符号
- ¥50 安装pyaudiokits失败
- ¥15 计组这些题应该咋做呀
- ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?