问题:在一个整形有序数组中查找想要的数字,找到了返回下标,找不到返回-1。折半查找也叫二分查找。
思路:每次取数组中间位置的数字与待查找数字进行比对,若待查找数字较大则往后继续取中间位置数字比对,较小时则往前比对,直至找到待查找数字。
重点:写一个折半查找的函数BinarySearch(),完成查找过程,并在主函数中进行调用。定义变量left与right,[left,right]构成待查找区间。并初始化left为0,right=sizeof(arr)/ sizeof(arr[0])-1,即数组长度除以数组首元素长度再减一。但数组作为函数参数的时候,会隐式转换成指针,因此不能直接计算出right的值。我们需要借助另一个变量size,在主函数中先计算size=sizeof(arr)/ sizeof(arr[0]),再在函数中直接调用size,这样就可以通过size-1来计算right的值了。
实现代码:
#include<stdio.h>
#include<stdlib.h>
int BinarySearch(int arr[], int size, int to_find) {
int left = 0;
int right = size - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (to_find < arr[mid]) {
right = mid - 1;//若被查找数小于中间下标的数,则在前半部分继续查找
//且下标为mid的数不必再查找
}
else if (to_find > arr[mid]) {
left = mid + 1;
}
else {
printf("%d\n", mid);//若找到,返回该数的下标
return mid;
}
}
printf("-1\n");
return 0;
}
int main() {
int arr[6] = { 1,2,3,4,5,6 };
int size = sizeof(arr) / sizeof(arr[0]);
int ret = BinarySearch(arr, size, 5);
system("pause");
return 0;
}
运行结果: