二分查找

/** 二分查找 */
int binarySearch(int nums[] ,int target,int count);

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int count = 7;
        int a[7] = {1, 2, 3, 5, 7, 9, 10};
        int index = binarySearch(a, 9, count);
        printf("index = %d\n",index);
    }
    return 0;
}

/** 二分查找,前提对已排序数组,时间复杂度logN(n、n/2、n/4、n/8...) */
int binarySearch(int nums[] ,int target,int count)
{
    if (nums == NULL || count == 0) {return -1;}
    int start = 0,end = count - 1;
    while (start + 1 < end)//保证下标(start+1)和end最多只为相邻的元素
    {
        int mid = start + (end - start) / 2;//防止程序溢出
        if (nums[mid] == target)
        {
            end = mid;
        }
        else if (nums[mid] < target)
        {
            start = mid;
        }
        else if (nums[mid] > target)
        {
            end = mid;
        }
    }
    if (nums[start] == target) {
        return start;
    }
    if (nums[end] == target) {
        return end;
    }
    return -1;
}

 1.假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。

你需要找到其中最小的元素。

public int findMin(int[] num) {
        // write your code here
        int start = 0,end = num.length - 1;
        int target = num[end];
        while (start + 1 < end)
        {
            int mid = start + (end - start)/2;
            if (num[mid] < target)
            {
                end = mid;
            }
            else if (num[mid] > target)
            {
                start = mid;
            }
            else if (num[mid] == target)
            {
                end = mid;
            }
        }
        
        if (num[start] <= target)
        {
            return num[start];
        }
        else
        {
            return num[end];
        }
        
    }

 

posted @ 2016-02-26 09:58  forrHuen  阅读(222)  评论(0编辑  收藏  举报