📜  C# 排序数组中的天花板程序

📅  最后修改于: 2022-05-13 01:54:38.682000             🧑  作者: 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# 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)

有关更多详细信息,请参阅排序数组中有关天花板的完整文章!