二分查找(BinarySearch)
二分查找用于在一个有序数组中,查找是否存在目标值,是分治法思维的体现,把大问题对半平分成两个小问题。
下面是尾递归形式的二分查找的伪代码,如果找到,则返回在array中的索引,如果没有找到,就返回-1。
// java
Int BinarySearch(int[] array, int lo, int hi, int key) // 分别是待查找的数组,下限,上限,目标值。
if (hi<lo) return -1;
mid = lo + (hi-lo)//2; # 这里//表示商取整
if (a[mid] == key):
return mid;
if (a[mid] < key):
return BinarySearch(array, key, mid+1, hi);
if (a[mid] > key):
return BinarySearch(array, key, lo, mid-1);
尾递归可以很轻松的写成while循环形式,下面是循环形式的二分查找伪代码。
// java
Int BinarySearch(int[] array, int key)
lo = 0;
hi = array.length-1;
while (hi>=lo)
mid = lo + (hi-lo)//2; # 这里//表示商取整
if (a[mid] == key):
return mid;
if (a[mid] < key):
lo = mid+1;
if (a[mid] > key):
hi = mid-1;
return -1;
把一个大问题平分成两个小问题,设大问题需要的时间是 T ( n ) T(n) T(n),则小问题的时间是 T ( n 2 ) T(\frac{n}{2}) T(2n),所以递归关系式是 T (