二分查找法
非递归
int binarysearch(int a[], int n, int key)
{
int low, high, mid;
low = 0;
high = n - 1;
while (low <= high)
{
mid = low + (high - low) / 2;
/*使用 (low + high) / 2 会有整数溢出的问题
(问题会出现在当low + high的结果大于表达式结果类型所能表示的最大值时,
这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题)*/
if (a[mid] == key)
return mid;
else if (a[mid] < key)
low = mid + 1;
else if (a[mid] > key)
high = mid - 1;
}
return -1;
}
#递归
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int binarysearch(int a[],int n,int key)
/*key为要找的值,low为要找的区间的最小值下标,high为最大值下标*/
{
int low=0, high=n-1;
int mid,index;
while (low <= high) {
mid = low + (high - low) / 2;
if (a[mid] == key)
return mid;
else if (a[mid] < key)
{
index = binarysearch(a + n / 2, n / 2, key);
return index + n / 2;
}
else if (a[mid] > key)
return binarysearch(a, n / 2, key);
else
return -1;
}
return -1;
}
int main() {
int a[100];
int n,key;
scanf_s("%d %d",&n,&key);
for (int i = 0; i < n; i++)
scanf_s("%d", &a[i]);
int ret = binarysearch(a, n, key);
if (ret != -1)
printf("Y");
else
printf("N");
return 0;
}