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# program to find celing
// in a sorted array
using System;
class GFG {
// Function to get index of ceiling
// of x in arr[low..high]
static 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 element
of the array, return -1 in
this case */
return -1;
}
// Driver code
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]);
}
}
// This code is contributed by Sam007.
C#
// C# program to find celing
// in a sorted array
using System;
class GFG {
// Function to get index of ceiling
// of x in arr[low..high]
static 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[low...mid-1]
else {
if (mid - 1 >= low && x > arr[mid - 1])
return mid;
else
return ceilSearch(arr, low, mid - 1, x);
}
}
// Driver code
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.Write("Ceiling of " + x +
" doesn't exist in array");
else
Console.Write("ceiling of " + x +
" is " + arr[index]);
}
}
// This code is contributed by Sam007.
输出 :
ceiling of 3 is 8
时间复杂度: O(n)
方法 2(二分查找)
这里没有使用线性搜索,而是使用二进制搜索来查找索引。二分搜索将时间复杂度降低到 O(Logn)。
C#
// C# program to find celing
// in a sorted array
using System;
class GFG {
// Function to get index of ceiling
// of x in arr[low..high]
static 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[low...mid-1]
else {
if (mid - 1 >= low && x > arr[mid - 1])
return mid;
else
return ceilSearch(arr, low, mid - 1, x);
}
}
// Driver code
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.Write("Ceiling of " + x +
" doesn't exist in array");
else
Console.Write("ceiling of " + x +
" is " + arr[index]);
}
}
// This code is contributed by Sam007.
输出 :
Ceiling of 20 doesn't exist in array
时间复杂度:O(Logn)
有关更多详细信息,请参阅排序数组中有关天花板的完整文章!