Binary Search PBP

public class Iterative {
    /**
    Normal Binary Search for sorted array like : 1,2,3,4,5,6,7,8,9,10,11
    Complexity: O(LogN)
    PS: element can be duplicated
    */
    static public int binarySearch(int[] array, int target){
        int left = 0, right = array.length - 1;
        while (left <= right){
            int middle = (right + left) / 2;
 
            if (array[middle] == target)
                return middle;
 
            if (array[middle] > target)
                right = middle - 1;
            else
                left = middle + 1;
        }
        return -1;
    }
    /**
    If the array is rotated-sorted-array, like: 5,6,7,8,9,10,1,2,3,4. We can alter the original binary search for this
    PS:the array must not have duplcations, otherwise the complexity will be O(N)
    Complexity: O(LogN)
    */
    static public int rotatedBinarySearch(int[] array, int target){
        int low = 0;
        int high = array.length - 1;
        int mid = 0;
        while (low <= high) {
            mid = (low + high) / 2;
            if (array[mid] == target) return mid;
            else {
                if (array[low] <= array[mid]) {  //decide left part is longer
                    if (target >= array[low] && target < array[mid]) {
                        high = mid - 1;
                    } else {
                        low = mid + 1;
                    }
                } else {    //right part is longer
                    if (target <= array[high] && target > array[mid]) {
                        low = mid + 1;
                    } else {
                        high = mid - 1;
                    }
                }
            }
        }
        return -1;
    }
}
TEST(binarySearch,BasicTest){
    Iterator iter;
    int array[] = {1,2,3,4,5,6,7,8,9,10};
    EXPECT_TRUE(4 == iter.Search(array,4));
    EXPECT_TRUE(5 == iter.Search(array,5));
    EXPECT_TRUE(6 == iter.Search(array,6));
    EXPECT_TRUE(7 == iter.Search(array,7));
    
    EXPECT_TRUE(-1 == iter.Search(array,11));
    EXPECT_TRUE(-1 == iter.Search(array,12));
    EXPECT_TRUE(-1 == iter.Search(array,0));
}

TEST(rotatedBinarySearch,BasicTest){
    Iterator iter;
    int array[] = {5,6,7,8,9,10,1,2,3,4};
    EXPECT_TRUE(4 == iter.Search(array,4));
    EXPECT_TRUE(5 == iter.Search(array,5));
    EXPECT_TRUE(6 == iter.Search(array,6));
    EXPECT_TRUE(7 == iter.Search(array,7));
    
    EXPECT_TRUE(-1 == iter.Search(array,11));
    EXPECT_TRUE(-1 == iter.Search(array,12));
    EXPECT_TRUE(-1 == iter.Search(array,0));
}

 

posted @ 2013-11-06 14:23  一只会思考的猪  阅读(262)  评论(0编辑  收藏  举报