二分搜索方法,充分利用了元素间的次序关系,采用分治策略。可在最坏情况下用时间O(logn)时间完成搜索。
二分搜索算法的基本思想是将n个元素分成个数大致相同的两半,取与x进行比较,
如果x=ar[n/2],则找到x算法终止,如果x<ar[n/2]则只要在数组a的左半部继续搜索,
如果x>ar[n/2],只要在数组的右半部继续搜索。
#include<stdio.h>
int BinarySearch_recur(int *br, int x, int left, int right)
{
int middle = 0;
if (left > right)
{
return -1;
}
else
{
int middle = (left + right) / 2;
if (x == br[middle])
{
return middle;
}
else if (x > br[middle])
{
return BinarySearch_recur(br, x, middle + 1, right);
}
else
{
return BinarySearch_recur(br, x, left, middle - 1);
}
}
return -1;
}
int BinarySearch(int *br, int x, int n)
{
int left = 0;
int right = n - 1;
int i = 0, j = 0;
while (left <= right)
{
int middle = (left + right) / 2;
if (x == br[middle])
{
return middle;
}
if (x > br[middle])
{
left = middle + 1;
}
else
{
right = middle - 1;
}
}
return -1;
}
int main()
{
const int n = 7;
int ar_a[n] = { 2,4,6,8,10,13,15 };//已经排好序
int x = 0;
int left = 0, right = n - 1;
printf("Please input the number:");
scanf_s("%d", &x);
printf("二分查找递归实现:");
if (-1 == BinarySearch_recur(ar_a, x, left, right))
{
printf("data error!\n");
}
else
{
printf("the position is %d\n", BinarySearch(ar_a, x,n));
}
printf("二分查找非递归实现:");
if (-1 == BinarySearch_recur(ar_a, x, left, right))
{
printf("data error!\n");
}
else
{
printf("the position is %d\n", BinarySearch(ar_a, x,n));
}
}