书上习题有要求用递归和迭代实现一个二分查找算法,随即写了一个。
迭代法:
#include<stdio.h>
int binarySearch(int nums[], int left, int right, int X)
{
int mid;
mid = (left + right) / 2;
while(X != nums[mid])
{
if(X > mid)
mid = (mid + right) / 2;
else
mid = (left + mid) / 2;
}
return nums[mid];
}
void main()
{
int arr[] = {1, 2, 3, 4, 5, 6}, arrSize;
int X;
arrSize = sizeof(arr)/sizeof(int);
scanf("%d", &X);
printf("%d
", binarySearch(arr, 0, arrSize, X));
}
递归法:
#include<stdio.h>
int BinarySearch(int nums[], int numsFirst, int numsSize, int X)
{
int numsMid;
numsMid = (numsFirst + numsSize)/2;
if(X < nums[numsMid])
return BinarySearch(nums, numsFirst, numsMid, X);
else if(X > nums[numsMid])
return BinarySearch(nums, numsMid, numsSize, X);
else
return nums[numsMid];
}
void main()
{
int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int numsSize;
numsSize = sizeof(num)/sizeof(int);
printf("%d
", BinarySearch(num, 0, numsSize, 7));
}
因为二分查找算法思想就像一颗完全二叉树,深度 $ depth = lg(n+1) $ ,n为问题规模,递归子问题为2,因此以上两段代码的时间复杂度都为 $ O(lgn) $ 。