Ceiling in a sorted array
Last Updated :
10 Feb, 2023
Given a sorted array and a value x, the ceiling of x is the smallest element in an array greater than or equal to x, and the floor is the greatest element smaller than or equal to x. Assume that the array is sorted in non-decreasing order. Write efficient functions to find the floor and ceiling of x.
Examples :
For example, let the input array be {1, 2, 8, 10, 10, 12, 19}
For x = 0: floor doesn't exist in array, ceil = 1
For x = 1: floor = 1, ceil = 1
For x = 5: floor = 2, ceil = 8
For x = 20: floor = 19, ceil doesn't exist in array
In the below methods, we have implemented only ceiling search functions. Floor search can be implemented in the same way.
Method 1 (Linear Search)
Algorithm to search ceiling of x:
- If x is smaller than or equal to the first element in the array then return 0(index of the first element).
- Else linearly search for an index i such that x lies between arr[i] and arr[i+1].
- If we do not find an index i in step 2, then return -1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int ceilSearch( int arr[], int low, int high, int x)
{
int i;
if (x <= arr[low])
return low;
for (i = low; i < high; i++)
{
if (arr[i] == x)
return i;
if (arr[i] < x && arr[i+1] >= x)
return i+1;
}
return -1;
}
int main()
{
int arr[] = {1, 2, 8, 10, 10, 12, 19};
int n = sizeof (arr)/ sizeof (arr[0]);
int x = 3;
int index = ceilSearch(arr, 0, n-1, x);
if (index == -1)
cout << "Ceiling of " << x << " doesn't exist in array " ;
else
cout << "ceiling of " << x << " is " << arr[index];
return 0;
}
|
C
#include<stdio.h>
int ceilSearch( int arr[], int low, int high, int x)
{
int i;
if (x <= arr[low])
return low;
for (i = low; i < high; i++)
{
if (arr[i] == x)
return i;
if (arr[i] < x && arr[i+1] >= x)
return i+1;
}
return -1;
}
int main()
{
int arr[] = {1, 2, 8, 10, 10, 12, 19};
int n = sizeof (arr)/ sizeof (arr[0]);
int x = 3;
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;
}
|
Java
class Main
{
static int ceilSearch( int arr[], int low, int high, int x)
{
int i;
if (x <= arr[low])
return low;
for (i = low; i < high; i++)
{
if (arr[i] == x)
return i;
if (arr[i] < x && arr[i+ 1 ] >= x)
return i+ 1 ;
}
return - 1 ;
}
public static void main (String[] args)
{
int arr[] = { 1 , 2 , 8 , 10 , 10 , 12 , 19 };
int n = arr.length;
int x = 3 ;
int index = ceilSearch(arr, 0 , n- 1 , x);
if (index == - 1 )
System.out.println( "Ceiling of " +x+ " doesn't exist in array" );
else
System.out.println( "ceiling of " +x+ " is " +arr[index]);
}
}
|
Python3
def ceilSearch(arr, low, high, x):
if x < = arr[low]:
return low
i = low
for i in range (high):
if arr[i] = = x:
return i
if arr[i] < x and arr[i + 1 ] > = x:
return i + 1
return - 1
arr = [ 1 , 2 , 8 , 10 , 10 , 12 , 19 ]
n = len (arr)
x = 3
index = ceilSearch(arr, 0 , n - 1 , x);
if index = = - 1 :
print ( "Ceiling of %d doesn't exist in array " % x)
else :
print ( "ceiling of %d is %d" % (x, arr[index]))
|
C#
using System;
class GFG {
static int ceilSearch( int [] arr, int low,
int high, int x)
{
int i;
if (x <= arr[low])
return low;
for (i = low; i < high; i++) {
if (arr[i] == x)
return i;
if (arr[i] < x && arr[i + 1] >= x)
return i + 1;
}
return -1;
}
public static void Main()
{
int [] arr = { 1, 2, 8, 10, 10, 12, 19 };
int n = arr.Length;
int x = 3;
int index = ceilSearch(arr, 0, n - 1, x);
if (index == -1)
Console.Write( "Ceiling of " + x +
" doesn't exist in array" );
else
Console.Write( "ceiling of " + x +
" is " + arr[index]);
}
}
|
PHP
<?php
function ceilSearch( $arr , $low , $high , $x )
{
if ( $x <= $arr [ $low ])
return $low ;
for ( $i = $low ; $i < $high ; $i ++)
{
if ( $arr [ $i ] == $x )
return $i ;
if ( $arr [ $i ] < $x &&
$arr [ $i + 1] >= $x )
return $i + 1;
}
return -1;
}
$arr = array (1, 2, 8, 10, 10, 12, 19);
$n = sizeof( $arr );
$x = 3;
$index = ceilSearch( $arr , 0, $n - 1, $x );
if ( $index == -1)
echo ( "Ceiling of " . $x .
" doesn't exist in array " );
else
echo ( "ceiling of " . $x . " is " .
$arr [ $index ]);
?>
|
Javascript
<script>
function ceilSearch(arr, low, high, x)
{
let i;
if (x <= arr[low])
return low;
for (i = low; i < high; i++)
{
if (arr[i] == x)
return i;
if (arr[i] < x && arr[i+1] >= x)
return i+1;
}
return -1;
}
let arr = [1, 2, 8, 10, 10, 12, 19];
let n = arr.length;
let x = 3;
let index = ceilSearch(arr, 0, n-1, x);
if (index == -1)
document.write( "Ceiling of " + x + " doesn't exist in array " );
else
document.write ( "ceiling of " + x + " is " + arr[index]);
</script>
|
Time Complexity: O(n),
Auxiliary Space: O(1)
Method 2 (Binary Search)
Instead of using linear search, binary search is used here to find out the index. Binary search reduces the time complexity to O(Logn).
C++
#include <bits/stdc++.h>
using namespace std;
int ceilSearch( int arr[], int low, int high, int x)
{
int mid;
if (x <= arr[low])
return low;
if (x > arr[high])
return -1;
mid = (low + high) / 2;
if (arr[mid] == x)
return mid;
else if (arr[mid] < x) {
if (mid + 1 <= high && x <= arr[mid + 1])
return mid + 1;
else
return ceilSearch(arr, mid + 1, high, x);
}
else {
if (mid - 1 >= low && x > arr[mid - 1])
return mid;
else
return ceilSearch(arr, low, mid - 1, x);
}
}
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)
cout << "Ceiling of " << x
<< " doesn't exist in array " ;
else
cout << "ceiling of " << x << " is " << arr[index];
return 0;
}
|
C
#include <stdio.h>
int ceilSearch( int arr[], int low, int high, int x)
{
int mid;
if (x <= arr[low])
return low;
if (x > arr[high])
return -1;
mid = (low + high) / 2;
if (arr[mid] == x)
return mid;
else if (arr[mid] < x) {
if (mid + 1 <= high && x <= arr[mid + 1])
return mid + 1;
else
return ceilSearch(arr, mid + 1, high, x);
}
else {
if (mid - 1 >= low && x > arr[mid - 1])
return mid;
else
return ceilSearch(arr, low, mid - 1, x);
}
}
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;
}
|
Java
import java.util.Arrays;
public class CeilSearch {
public static int ceilSearch( int [] arr, int low, int high, int x) {
int mid;
if (x <= arr[low])
return low;
if (x > arr[high])
return - 1 ;
mid = (low + high) / 2 ;
if (arr[mid] == x)
return mid;
else if (arr[mid] < x) {
if (mid + 1 <= high && x <= arr[mid + 1 ])
return mid + 1 ;
else
return ceilSearch(arr, mid + 1 , high, x);
}
else {
if (mid - 1 >= low && x > arr[mid - 1 ])
return mid;
else
return ceilSearch(arr, low, mid - 1 , x);
}
}
public static void main(String[] args) {
int [] arr = { 1 , 2 , 8 , 10 , 10 , 12 , 19 };
int n = arr.length;
int x = 20 ;
int index = ceilSearch(arr, 0 , n - 1 , x);
if (index == - 1 )
System.out.println( "Ceiling of " + x + " doesn't exist in array" );
else
System.out.println( "ceiling of " + x + " is " + arr[index]);
}
}
|
Python3
def ceilSearch(arr, low, high, x):
if x < = arr[low]:
return low
if x > arr[high]:
return - 1
mid = (low + high) / 2 ;
if arr[mid] = = x:
return mid
elif arr[mid] < x:
if mid + 1 < = high and x < = arr[mid + 1 ]:
return mid + 1
else :
return ceilSearch(arr, mid + 1 , high, x)
else :
if mid - 1 > = low and x > arr[mid - 1 ]:
return mid
else :
return ceilSearch(arr, low, mid - 1 , x)
arr = [ 1 , 2 , 8 , 10 , 10 , 12 , 19 ]
n = len (arr)
x = 20
index = ceilSearch(arr, 0 , n - 1 , x);
if index = = - 1 :
print ( "Ceiling of %d doesn't exist in array " % x)
else :
print ( "ceiling of %d is %d" % (x, arr[index]))
|
C#
using System;
class GFG {
static int ceilSearch( int [] arr, int low, int high,
int x)
{
int mid;
if (x <= arr[low])
return low;
if (x > arr[high])
return -1;
mid = (low + high) / 2;
if (arr[mid] == x)
return mid;
else if (arr[mid] < x) {
if (mid + 1 <= high && x <= arr[mid + 1])
return mid + 1;
else
return ceilSearch(arr, mid + 1, high, x);
}
else {
if (mid - 1 >= low && x > arr[mid - 1])
return mid;
else
return ceilSearch(arr, low, mid - 1, x);
}
}
public static void Main()
{
int [] arr = { 1, 2, 8, 10, 10, 12, 19 };
int n = arr.Length;
int x = 20;
int index = ceilSearch(arr, 0, n - 1, x);
if (index == -1)
Console.Write( "Ceiling of " + x
+ " doesn't exist in array" );
else
Console.Write( "ceiling of " + x + " is "
+ arr[index]);
}
}
|
PHP
<?php
function ceilSearch( $arr , $low ,
$high , $x )
{
$mid ;
if ( $x <= $arr [ $low ])
return $low ;
if ( $x > $arr [ $high ])
return -1;
$mid = ( $low + $high )/2;
if ( $arr [ $mid ] == $x )
return $mid ;
else if ( $arr [ $mid ] < $x )
{
if ( $mid + 1 <= $high &&
$x <= $arr [ $mid + 1])
return $mid + 1;
else
return ceilSearch( $arr , $mid + 1,
$high , $x );
}
else
{
if ( $mid - 1 >= $low &&
$x > $arr [ $mid - 1])
return $mid ;
else
return ceilSearch( $arr , $low ,
$mid - 1, $x );
}
}
$arr = array (1, 2, 8, 10, 10, 12, 19);
$n = sizeof( $arr );
$x = 20;
$index = ceilSearch( $arr , 0, $n - 1, $x );
if ( $index == -1)
echo ( "Ceiling of $x doesn't exist in array " );
else
echo ( "ceiling of $x is" );
echo (isset( $arr [ $index ]));
?>
|
Javascript
<script>
function ceilSearch(arr, low, high, x)
{
let mid;
if (x <= arr[low])
return low;
if (x > arr[high])
return -1;
mid = (low + high)/2;
if (arr[mid] == x)
return mid;
else if (arr[mid] < x)
{
if (mid + 1 <= high && x <= arr[mid + 1])
return mid + 1;
else
return ceilSearch(arr, mid + 1, high, x);
}
else
{
if (mid - 1 >= low && x > arr[mid - 1])
return mid;
else
return ceilSearch(arr, low, mid - 1, x);
}
}
let arr = [1, 2, 8, 10, 10, 12, 19];
let n = arr.length;
let x = 20;
let index = ceilSearch(arr, 0, n - 1, x);
if (index == -1){
document.write(`Ceiling of ${x} doesn't exist in array `);
} else {
document.write(`ceiling of ${x} is ${arr[index]}`);
}
</script>
|
Output
Ceiling of 20 doesn't exist in array
Time Complexity: O(log(n)),
Auxiliary Space: O(1)
Another Implementation of Method 2 :
As like previous method here also binary search is being used but the code logic is different instead of lots of if else check i will simply return and lets understand through below steps :
Step 1 : { low->1, 2, 8, 10<-mid, 10, 12, 19<-high};
if( x < mid) yes set high = mid -1;
Step 2 : { low ->1, 2 <-mid, 8 <-high, 10, 10, 12, 19};
if( x < mid) no set low = mid + 1;
Step 3 : {1, 2, 8<-high,low,mid, 10, 10, 12, 19};
if( x == mid ) yes return mid
if(x < mid ) no low = mid + 1
Step 4 : {1, 2, 8<-high,mid, 10<-low, 10, 12, 19};
check while(low =< high)
condition break and return low which is my ceiling of target.
C++
#include <bits/stdc++.h>
using namespace std;
int ceilSearch( int arr[], int low, int high, int x)
{
if ( sizeof (arr) / sizeof (arr[0]) == 0) {
return -1;
}
int mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (arr[mid] == x)
return mid;
else if (x < arr[mid])
high = mid - 1;
else
low = mid + 1;
}
return low;
}
int main()
{
int arr[] = { 1, 2, 8, 10, 10, 12, 19 };
int n = sizeof (arr) / sizeof (arr[0]);
int x = 8;
int index = ceilSearch(arr, 0, n - 1, x);
if (index == -1)
printf ( "Ceiling of %d does not exist in an array" ,
x);
else
printf ( "Ceiling of %d is %d" , x, arr[index]);
return 0;
}
|
C
#include <stdio.h>
int ceilSearch( int arr[], int low, int high, int x)
{
if (x == 0) {
return -1;
}
int mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (arr[mid] == x)
return mid;
else if (x < arr[mid])
high = mid - 1;
else
low = mid + 1;
}
return low;
}
int main()
{
int arr[] = { 1, 2, 8, 10, 10, 12, 19 };
int n = sizeof (arr) / sizeof (arr[0]);
int x = 8;
int index = ceilSearch(arr, 0, n - 1, x);
if (index == -1)
printf ( "Ceiling of %d does not exist in an array" , x);
else
printf ( "Ceiling of %d is %d" , x, arr[index]);
return 0;
}
|
Java
class Main {
static int ceilSearch( int arr[], int low, int high,
int x)
{
if (x == 0 ) {
return - 1 ;
}
while (low <= high) {
int mid
= low + (high - low) / 2 ;
if (x == arr[mid]) {
return mid;
}
if (x < arr[mid]) {
high = mid - 1 ;
}
else {
low = mid + 1 ;
}
}
return low;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 8 , 10 , 10 , 12 , 19 };
int n = arr.length;
int x = 8 ;
int index = ceilSearch(arr, 0 , n - 1 , x);
if (index == - 1 )
System.out.println( "Ceiling of " + x
+ " doesn't exist in array" );
else
System.out.println( "ceiling of " + x + " is "
+ arr[index]);
}
}
|
Python3
def ceilSearch(arr, low, high, x):
if (x = = 0 ):
return - 1
while (low < = high):
mid = low + (high - low) / 2
mid = int (mid)
if (arr[mid] = = x):
return mid
elif (x < arr[mid]):
high = mid - 1
else :
low = mid + 1
return low
arr = [ 1 , 2 , 8 , 10 , 10 , 12 , 19 ]
n = len (arr)
x = 8
index = ceilSearch(arr, 0 , n - 1 , x)
if (index = = - 1 ):
print ( "Ceiling of" , x, "does not exist in an array" )
else :
print ( "Ceiling of" , x, "is" , arr[index])
|
C#
using System;
class GFG
{
static int ceilSearch( int [] arr, int low, int high, int x)
{
if (x == 0)
{
return -1;
}
while (low <= high)
{
int mid = low + (high - low) / 2;
if (x == arr[mid])
{
return mid;
}
if (x < arr[mid])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return low;
}
public static void Main()
{
int [] arr = { 1, 2, 8, 10, 10, 12, 19 };
int n = arr.Length;
int x = 8;
int index = ceilSearch(arr, 0, n - 1, x);
if (index == -1)
Console.WriteLine( "Ceiling of " + x + " doesn't exist in array" );
else
Console.WriteLine( "ceiling of " + x + " is " + arr[index]);
}
}
|
Javascript
function ceilSearch(arr, low, high, x)
{
if (x == 0)
{
return -1;
}
var mid;
while (low <= high)
{
mid = low + (high - low) / 2;
if (arr[mid] == x)
{
return mid;
}
else if (x < arr[mid])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
return low;
}
var arr = [1, 2, 8, 10, 10, 12, 19];
var n = arr.length;
var x = 8;
var index = ceilSearch(arr, 0, n - 1, x);
if (index == -1)
{
console.log( "Ceiling of " + x + " does not exist in an array" );
}
else
{
console.log( "Ceiling of " + x + " is " + arr[index]);
}
|
Time Complexity: O(log(n)), where n is the length of the given array,
Auxiliary Space: O(1)
Method Using C++ STL lower_bound
The lower_bound() method in C++ is used to return an iterator pointing to the first element in the range [first, last) which has a value not less than val. This means that the function returns an iterator pointing to the next smallest number just greater than or equal to that number. If there are multiple values that are equal to val, lower_bound() returns the iterator of the first such value.
Simpler and Shorter code :
C++
#include <bits/stdc++.h>
using namespace std;
int main()
{
vector< int > arr = { 1, 2, 8, 10, 10, 12, 19 };
int n = arr.size();
int x = 8;
auto itr = lower_bound(arr.begin(), arr.end(),x);
int idx = itr - arr.begin();
if (idx == n) {
cout << "Ceil Element does not exist " << endl;
}
else {
cout << "Ceil Element of " << x << " is " << arr[idx] << endl;
}
return 0;
}
|
Java
import java.util.Arrays;
class GFG {
public static void main(String[] args)
{
int [] arr = { 1 , 2 , 8 , 10 , 10 , 12 , 19 };
int n = arr.length;
int x = 8 ;
int idx = Arrays.binarySearch(arr, x);
if (idx < 0 ) {
idx = Math.abs(idx) - 1 ;
}
if (idx == n) {
System.out.println(
"Ceiling Element does not exist" );
}
else {
System.out.println( "Ceiling Element of " + x
+ " is " + arr[idx]);
}
}
}
|
Python3
from bisect import bisect_left
arr = [ 1 , 2 , 8 , 10 , 10 , 12 , 19 ]
n = len (arr)
x = 8
idx = bisect_left(arr, x)
if idx = = n:
print ( "Ceil Element does not exist" )
else :
print (f "Ceil Element of {x} is {arr[idx]}" )
|
C#
using System;
public class GFG {
public static void Main( string [] args)
{
int [] arr = { 1, 2, 8, 10, 10, 12, 19 };
int n = arr.Length;
int x = 8;
int idx = Array.BinarySearch(arr, x);
if (idx < 0) {
idx = Math.Abs(idx) - 1;
}
if (idx == n) {
Console.WriteLine(
"Ceiling Element does not exist" );
}
else {
Console.WriteLine( "Ceiling Element of " + x
+ " is " + arr[idx]);
}
}
}
|
Javascript
const arr = [1, 2, 8, 10, 10, 12, 19];
const n = arr.length;
const x = 8;
let idx = arr.findIndex(val => val >= x);
if (idx === -1) {
console.log( "Ceiling Element does not exist" );
}
else {
console.log(`Ceiling Element of ${x} is ${arr[idx]}`);
}
|
Output
Ceil Element of 8 is 8
Time Complexity: O(log(n)), where n is the length of the given array,
Auxiliary Space: O(1)
https://www.youtube.com/watch?v=Nzm9emAkSCM
Related Articles:
Floor in a Sorted Array
Find floor and ceil in an unsorted array
Please write comments if you find any of the above codes/algorithms incorrect, find better ways to solve the same problem, or want to share code for floor implementation.
Please Login to comment...