问题:在有序数组中查找给定元素的下标goal。
在查找一个数组元素的下标,可以用循环来解决,但是如果一个数足够大,比如说手机的价格,用循环来查找,就相当于叫一个人猜,从0开始,需要猜很久。这时候就出现了二分查找,也叫对半查找。
对半查找顾名思义就是猜一次,下次猜的内容就减少一半
这时候定义一个变量left表示最左边元素的下标,在定义一个right表示最右边元素的下标,而mid就表示中间元素的下标。
当中间值小于目标值,left重新定义。
if (mid < goal) { left = mid + 1; }
当中间值大于目标元素,right重新定义。
else if (mid > goal) { right = mid - 1; }
当中间元素等于目标元素时,打印即可。
else { printf("你找到了,下标为:%d", mid); break; }
这中查找方式可能会使用多次,这时候来一个while循环就可以重复查找的撒
如果最后数组元素找不到对应的元素,就在while循环外打印出找不到。
if (left > right) printf("找不到");
最后代码如下:
#include<stdio.h>//在数组中找到某个数,二分查找 int main() { int goal = 7; int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof arr[0]; int left = 0; int right = sz - 1; while (left <= right) { int mid = (left + right) / 2; if (mid < goal) { left = mid + 1; } else if (mid > goal) { right = mid - 1; } else { printf("找到了,下标为:%d", mid); break; } } if (left > right) printf("找不到"); return 0; }