折半查找过程

过程

比如 对于 arr = [1, 3, 5, 7, 9] 这个有序数组 查找 ele。

折半查找过程就是利用 low 和 high 的位置不断 确定ele在数组中的范围

int low = 0, high = len;
int m = (low + high) / 2; 

做法是利用中间值 arr[m] 与 ele 比较 ,缩小边界。 

while ( low <= high){

    m = (low + high) / 2; 

    if (arr[m] > ele)
        high = m - 1;
    else
        low = m + 1;
}

理解

这里 具体什么时候 arr[m] > ele 什么时候 >=?

并且 最后的答案是 low 还是 high 还是high + 1? 

经常记不住,利用二叉树来理解,方便记忆,也更具有解释性。  

对于上述arr查找过程,用下面的二叉树表示如下。

可以看到终止时,high < low 并且 high +1 = low 的。另外,我们观察终止条件时,(左边为例,high=2,low=3 对应 5, 7 标明  5<=ele<7 意味着找到了ele 对于arr的边界;右边同理)

折半查找过程_第1张图片

对于high 和 low 相等的情况, 也是同理。这对于一些需要确定范围的题,很好的确定了具体是选择high还是选择low。

折半查找过程_第2张图片

你可能感兴趣的:(算法,数据结构)