分治算法---二分搜索算法

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

--------------------------------------------------------------------------------------------------------------------------------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值