定义一个长度为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; }
效果:
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
- ¥20 怎么用dlib库的算法识别小麦病虫害
- ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
- ¥15 java写代码遇到问题,求帮助
- ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
- ¥15 有了解d3和topogram.js库的吗?有偿请教
- ¥100 任意维数的K均值聚类
- ¥15 stamps做sbas-insar,时序沉降图怎么画
- ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
- ¥15 关于#Java#的问题,如何解决?