二分查找

二分查找查找key最左和最右的位置

利用这个特点,可以在O(log n)时间 在排序的数组中,统计一个数出现的次数。如[1,2,2,3],2出现了两次

//most_left_or_right: true 表示最左, false表示最右
int binary_search_most_left_or_right(int* array, int size, int key, bool most_left_or_right = true)
{
    int low = 0;
    int high = size - 1;
    while(low <= high) {
        int mid = (low + high) / 2;
        if( array[mid] > key) {
            high = mid - 1;
        }
        else if( array[mid] < key) {
            low = mid + 1;
        }
        else {
            if(most_left_or_right == true) {//查找最左
                if( low == mid)
                    return mid;
                high = mid;
            }
            else { //查找最右
                if( high == mid)
                    return mid;
                low = mid;
            }
        }
    }
    return -1;
}


posted @ 2012-11-11 23:28  junfeng_feng  阅读(157)  评论(0)    收藏  举报