最近看一些算法题发现这些问题到最后落实到实现上都是编程基础的体现,包括对基本的for,if,else,while等语句的理解程度,还有对循环递归的理解。所以还是得回归最基本的算法,现在去学习那些高深复杂的DP,KMP,红黑树未免有点好高骛远。目前应该坚持基础,打好基础,毕竟不是CS科班出身。言归正传,二分查找就是一个最基础的算法。它的时间复杂度O(logn)。分为迭代实现和递归实现两种,如下:程序没有经过很多测试,应该有bug,欢迎指正。
int BinarySearch(int * a, int beg, int end, int elem) { if(beg <= end) { int mid = (beg + end ) / 2; if(a[mid] == elem) { return mid; } else if(a[mid] > elem) { end = mid-1; } else { beg = mid+1; } return BinarySearch(a, beg, end, elem); } else { return -1; } } int BinarySearchRecursive(int *a, int length, int elem) { if(a == NULL || length <=0) { return -1; } return BinarySearch(a, 0, length-1, elem); } int BinarySearchIterator(int *a, int length, int elem) { if(a == NULL || length <=0) { return -1; } int beg = 0; int end = length-1; int mid = 0; while(beg <= end) { mid = (beg + end) / 2; if(a[mid] == elem) { return mid; } else if(a[mid] > elem) { beg = mid + 1; } else { end = mid - 1; } } return -1; }
这里主要注意二分查找时,两个下标的变化,以及最终结束查找的判断条件是beg>end(查找失败),或者(a[mid]==end)。时间有限,代码质量一般,轻喷。