写一个函数,实现一个整形有序数组的二分查找。
二分查找法(折半查找):是一种效率较高的查找方法,但必须要求查找的序列是有序排列的。
思路:在数组中查找一个数字存不存在时,将目标数字与数组的中间数进行比较,若目标数字比中间数大时,数组左下标增加到mid+1;同理,目标数字比中间数小时,数组右下标变为mid-1;与此种方法的好处是一次性可排除一半的数字,大大提高了程序的效率。
#include<stdio.h>
#include<windows.h>
#include<assert.h>
int MathSearch(int *arr, int sz, int key)
{
assert(arr);
int left = 0;
int right = sz - 1;
while (left <= right)
{
int mid = (left&right) + ((left^right) >> 1);
//求两个数的平均值的最优方法
if (key > mid)
{
left = mid + 1;//当目标数在中间数左边,左值变为mid+1
}
else if (key < mid)
{
right = mid - 1;
}
else//目标数字与中间数相同时
{
return mid;
}
}
}
int main()
{
int arr[] = {0,1,2,3,4,5,6,7,8,9};
int sz = sizeof(arr) / sizeof(arr[0]);
int key = 0;
printf("请输入您想查找的字符:>\n");
scanf("%d", &key);
int ret = MathSearch(arr, sz, key);
if (ret == key)
{
printf("%d\n", ret);
}
else
{
printf("数字不存在!\n");
}
system("pause");
return 0;
}