二分查找

int l = 0, r = cSize - 1, mid;
while (l < r) {
    mid = (l + r) >> 1;
    if (tmp > array[mid]) {
        l = mid + 1;
    }
    else {
        r = mid;
    }
}
return l;

最终得到第一个大于等于tmp的数组元素的下标。

当l = r - 1时,mid = (l + r) >> 1 == l,假设l = i,则r = i + 1,mid = (2 * i + 1) / 2 = i。所以l = mid + 1。

tmp 大于array[mid] 时,向右l = mid + 1, 左边的元素包括array[mid] 都小于tmp,不管;其他情况,向左移动,array[r] = array[mid],右边的元素array[mid + 1]以及之后的元素一定大于tmp,不管。范围不断缩小,最后变成l = r - 1的情况,变成tmp 和array[l]比较。

如果tmp小于第一个元素,得到0。

如果tmp大于最后一个元素,得到size - 1。

posted on 2015-09-04 23:56  一五一十  阅读(104)  评论(0)    收藏  举报

导航