插值搜索,搜索降序数组

时间:2018-04-26 17:29:09

标签: c# arrays algorithm sorting interpolation

我想修改此算法,以便它可以在数组中找到已按降序排序的值。这目前仅适用于提升。

public static int interpo(double[] array, double key, int order)
{
    int low = 0, high = array.Length - 1;
    int pos = 0;
    int count = 0;

    while ((low <= high) && (key >= array[low]) && (key <= array[high]))
    {
        count++;
        pos = Convert.ToInt32(low + (high - low) / (array[high] - array[low]) * 
            (key - array[low]));

        if (array[pos] == key)
        {
            // Write out the position and the value of whats in the position
            Console.WriteLine("\n     {0} : {1}", pos, array[pos]);                   
            break;
        }

        if (array[pos] < key)
            low = pos + 1;
        else
            high = pos - 1;

        // If the count is greater than the array size, do the following
        if (count > array.Length) 
        {
            // Pass through the position within the array to the close element 
            // method, which will display the closest values within the array
            closeelement(array, key, pos);

            // Return nothing                      
            return -2;  
        }
    }

    return -1;
}

2 个答案:

答案 0 :(得分:0)

假设您希望能够在参数NNP VBD RBR VBN IN 中传递数组已排序的顺序,您只需更改终止条件,就像这样(使用0 =降序,1 =升序) :

order

修改

如果您需要的功能能够在降序数组中查找值,只需更改终止条件:

public static int interpo(double[] array, double key, int order)
{
    int low = 0, high = array.Length - 1;
    int pos = 0;
    int count = 0;

    while ((low <= high) && ((order == 1 && (key >= array[low]) && (key <= array[high])) || (order == 0 && (key <= array[low]) && (key >= array[high]))))
    {
        count++;
        pos = Convert.ToInt32(low + (high - low) / (array[high] - array[low]) *
            (key - array[low]));

        if (array[pos] == key)
        {
            // Write out the position and the value of whats in the position
            Console.WriteLine("\n     {0} : {1}", pos, array[pos]);
            break;
        }

        if (array[pos] < key)
            low = pos + 1;
        else
            high = pos - 1;

        // If the count is greater than the array size, do the following
        if (count > array.Length)
        {
            // Pass through the position within the array to the close element 
            // method, which will display the closest values within the array
            closeelement(array, key, pos);

            // Return nothing                      
            return -2;
        }
    }

    return -1;
}

答案 1 :(得分:0)

既然你说这个算法适用于按升序排序的数组,我可以想到以下方法:

  1. 切换索引访问,即不是访问索引i处的元素,而是访问array.Length - i - 1处的元素

    示例:

    而不是写array[low]array[array.Length - 1 - low]。您可以 通过在方法的开头引入变量来简化这一过程:

    int l = array.Length - 1;
    

    然后在你的代码中做例如:

    while ((low <= high) && (key >= array[l - low]) && (key <= array[l - high])) 
    { /* ... */ }
    
  2. 在执行算法之前反转数组。您可以使用Array.Reverse()执行此操作。