二分查找的两种实现

// 递归版本
        int binary_search(const int arr[], int start, int end, int key) {
        if (start > end)
            return -1;
        int mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法
        if (arr[mid] > key)
            return binary_search(arr, start, mid - 1, key);
        if (arr[mid] < key)
            return binary_search(arr, mid + 1, end, key);
        return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於
    }
// while循环
    int binary_search(const int arr[], int start, int end, int key) {
    int mid;
    while (start <= end) {
        mid = start + (end - start) / 2; //直接平均可能會溢位,所以用此算法
        if (arr[mid] < key)
            start = mid + 1;
        else if (arr[mid] > key)
            end = mid - 1;
        else
            return mid; //最後檢測相等是因為多數搜尋狀況不是大於要不就小於
    }
    return -1;
}

二分查找法在算法家族大类中属于“分治法”,分治法基本都可以用递归来实现的。
最差时间复杂度 O(log n)
最优时间复杂度 O(1)
平均时间复杂度 O(log n)

猜你喜欢

转载自blog.csdn.net/jqsad/article/details/52513166