我想修改此算法,以便它可以在数组中找到已按降序排序的值。这目前仅适用于提升。
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;
}
答案 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)
既然你说这个算法适用于按升序排序的数组,我可以想到以下方法:
切换索引访问,即不是访问索引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]))
{ /* ... */ }
在执行算法之前反转数组。您可以使用Array.Reverse()
执行此操作。