Open in App
Not now

# Algorithms | Searching | Question 3

• Last Updated : 28 Jun, 2021

Given a sorted array of integers, what can be the minimum worst-case time complexity to find ceiling of a number x in given array? The ceiling of an element x is the smallest element present in array which is greater than or equal to x. Ceiling is not present if x is greater than the maximum element present in array. For example, if the given array is {12, 67, 90, 100, 300, 399} and x = 95, then the output should be 100.

(A)

O(loglogn)

(B)

O(n)

(C)

O(log(n))

(D)

O(log(n) * log(n))

Explanation:

We modify the standard binary search to find the ceiling. The time complexity T(n) can be written as T(n) <= T(n/2) + O(1) Solution of above recurrence can be obtained by Master Method. It falls in case 2 of the Master Method. The solution is O(Logn).

## C

 `#include `   `/* Function to get index of ceiling of x in arr[low..high]*/` `int` `ceilSearch(``int` `arr[], ``int` `low, ``int` `high, ``int` `x)` `{` `    ``int` `mid;`   `    ``/* If x is smaller than or equal to the first element,` `      ``then return the first element */` `    ``if` `(x <= arr[low])` `        ``return` `low;`   `    ``/* If x is greater than the last element, then return -1` `     ``*/` `    ``if` `(x > arr[high])` `        ``return` `-1;`   `    ``/* get the index of middle element of arr[low..high]*/` `    ``mid = (low + high) / 2; ``/* low + (high - low)/2 */`   `    ``/* If x is same as middle element, then return mid */` `    ``if` `(arr[mid] == x)` `        ``return` `mid;`   `    ``/* If x is greater than arr[mid], then either arr[mid +` `      ``1] is ceiling of x or ceiling lies in` `      ``arr[mid+1...high] */` `    ``else` `if` `(arr[mid] < x) {` `        ``if` `(mid + 1 <= high && x <= arr[mid + 1])` `            ``return` `mid + 1;` `        ``else` `            ``return` `ceilSearch(arr, mid + 1, high, x);` `    ``}`   `    ``/* If x is smaller than arr[mid], then either arr[mid]` `       ``is ceiling of x or ceiling lies in arr[mid-1...high]` `     ``*/` `    ``else` `{` `        ``if` `(mid - 1 >= low && x > arr[mid - 1])` `            ``return` `mid;` `        ``else` `            ``return` `ceilSearch(arr, low, mid - 1, x);` `    ``}` `}`   `/* Driver program to check above functions */` `int` `main()` `{` `    ``int` `arr[] = { 1, 2, 8, 10, 10, 12, 19 };` `    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);` `    ``int` `x = 20;` `    ``int` `index = ceilSearch(arr, 0, n - 1, x);` `    ``if` `(index == -1)` `     ``printf``(\"Ceiling of %d doesn\'t exist in array \", x);` `   ``else` `     ``printf``(\"ceiling of %d is %d\", x, arr[index]);` `   ``getchar``();` `   ``return` `0;` `}`

Quiz of this Question
Please comment below if you find anything wrong in the above post

My Personal Notes arrow_drop_up
Related Articles