1..二分搜索的前提条件
使用二分搜索进行查找的数组必须有序,假如数组无序,则二分搜索的输出结果是不正确的。本次叙述中,假设数组元素顺序为非递减的(a0<=a1<=a2<=...<=ai)。
2.用分而治之的术语描述二分搜索算法如下:
(1) 由于数组中元素按一定顺序排列,则可先确定数组中间位置的元素,并根据中间位置的元素将数组划分为两个元素个数差不多相当的两个子数组 。
(2) 由于数组元素有序,则需先将数组中间位置的元素与待查找的元素进行比较,如果相等,则算法结束;
(3) 如果中间位置的元素不是待查找的元素,则:
a. 若待查找的元素比中间位置的元素小,则在中间元素左侧的子数组内继续查找;
b.若待查找的元素比中间位置的元素大,则在中间元素右侧的子数组内继续查找;
(4) 由于数组元素有序,使用分治算法过程中并没有查找每个子数组,而是根据中间元素的值,不断定位到某个子数组中,所以不存在各个子数组输出结果的合并,原实例的答案就是较小实例的答案。
3. 二分搜索(递归版本)
--------------------------------------------------------------------------------------------------------------------------------
问题:判断X是否在一个大小为n的按非降序排列的有序数组A中
输入:有序数组A(非递减顺序,索引范围为1到n); 键X; 正整数n
输出:若X在数组中存在,则返回X在S中的位置,若X不在S中,则为0
过程:binarysearch(low,high)
1. if low > high then return 0;
2. else
3. mid <- (low + high) / 2
4. if x = A[mid] then return mid
5. else if x < A[mid] then return binarysearch(low, mid-1)
6. else return binarysearch(mid+1, high)
7. endif
--------------------------------------------------------------------------------------------------------------------------------
4. 二分搜索(非递归算法)
--------------------------------------------------------------------------------------------------------------------------------
问题:实现非递归的二分查找
输入:一个升序数组A[0...n-1] 和 一个查找键K
输出:一个数组元素的下标,该元素等于K;如果没有这样一个元素,则返回-1
过程:BinarySearch(A[0...n-1,K)
1. h <- 0; r <- n-1;
2. while l <= r do
3. m <- (h+r)/2;
4. if K = A[m] then return m
5. else if K < A[m] then r <- m-1
6. else then h <- m+1
7. return -1
--------------------------------------------------------------------------------------------------------------------------------