📌  相关文章
📜  用于排序数组中的天花板的 C++ 程序

📅  最后修改于: 2022-05-13 01:54:52.069000             🧑  作者: Mango

用于排序数组中的天花板的 C++ 程序

给定一个排序数组和一个值 x,x 的上限是数组中大于或等于 x 的最小元素,下限是小于或等于 x 的最大元素。假设数组按非降序排序。编写有效的函数来找到 x 的下限和上限。
例子 :

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

在下面的方法中,我们只实现了天花板搜索功能。楼层搜索可以以相同的方式实现。
方法一(线性搜索)
搜索 x 上限的算法:
1) 如果 x 小于或等于数组中的第一个元素,则返回 0(第一个元素的索引)
2) Else 线性搜索索引 i,使得 x 位于 arr[i] 和 arr[i+1] 之间。
3) 如果我们在第 2 步中没有找到索引 i,则返回 -1

C++
// C++ implementation of above approach#include using namespace std;/* Function to get index of ceiling of x in arr[low..high] */int ceilSearch(int arr[], int low, int high, int x){int i;/* If x is smaller than or equal to first element,then return the first element */if(x <= arr[low])
return low;
/* Otherwise, linearly search for ceil value */
for(i = low; i < high; i++)
{
if(arr[i] == x)
return i;
/* if x lies between arr[i] and arr[i+1] including
arr[i+1], then return arr[i+1] */
if(arr[i] < x && arr[i+1] >= x)return i+1;}/* If we reach here then x is greater than the last elementof the array, return -1 in this case */return -1;}/* Driver code*/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;
}
// This is code is contributed by rathbhupendra
[tabbyending]Output : ceiling of 3 is 8Time Complexity : O(n)Method 2 (Binary Search) Instead of using linear search, binary search is used here to find out the index. Binary search reduces time complexity to O(Logn).


C++
#include using namespace std;/* Function to get index ofceiling of x in arr[low..high]*/int ceilSearch(int arr[], int low, int high, int x){int mid;/* If x is smaller thanor 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 xor 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[low...mid-1] */
else
{
if(mid - 1 >= low && x > arr[mid – 1])return mid;elsereturn ceilSearch(arr, low, mid – 1, x);}}// Driver Codeint 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;
}
// This code is contributed by rathbhupendra
[tabbyending]Output :  Ceiling of 20 doesn't exist in array Time Complexity: O(Logn) Please refer complete article on Ceiling in a sorted array for more details!