!Редактировать - для решения проблемы. Вместо получения нижней границы я получаю -1, поэтому алгоритм получает все индексы от -1 до верхней границы. Нашего профессора не волнует, реализуем ли мы алгоритм сами, пока мы можем защитить его и понять перед ним. Программа работает нормально, но выдает неверный результат. Вместо того, чтобы предоставлять мне фактические индексы, содержащие все значения, попадающие в этот интервал, он дает мне все индексы от -1 до верхней границы.
!Редактировать -- Моя задача: У меня есть массив температур, и мне нужно написать алгоритм, который при заданном интервале будет возвращать все индексы, содержащие значения, находящиеся внутри этого интервала. Допуск на ошибку составляет 0,9, что означает, что если мой интервал равен [20...25], 19,1 — это нормально, но 19 — нет, по той же логике 25,9 — это нормально, а 21 — нет.
Вот мой код:
Код: Выделить всё
static void Main(string[] args)
{
Random rnd = new Random();
double[] arrNumber = new double[90000000];
for (int i = 0; i < arrNumber.Length; i++)
arrNumber[i] = rnd.NextDouble() * 1000;
Array.Sort(arrNumber);
double[] interval = { 200, 250 };
var time = Stopwatch.StartNew();
int[] index = ExtractInterval(arrNumber, interval);
time.Stop();
TimeSpan timeTaken = time.Elapsed;
Console.WriteLine(timeTaken);
Console.WriteLine(index.Length);
Console.WriteLine(arrNumber[index[0] - 1]);
Console.WriteLine(arrNumber[index.Length]);
Console.ReadLine();
}
static int[] ExtractInterval(double[] arrNumber, double[] interval)
{
double start = interval[0];
double end = interval[1];
List result = new List();
int lowerBound = findLowerBound(arrNumber, start);
int upperBound = findUpperBound(arrNumber, end);
for (int i = lowerBound; i < upperBound; i++)
{
result.Add(i);
}
return result.ToArray();
}
static int findLowerBound(double[] arr, double lowerBound)
{
int low = 0;
int high = arr.Length - 1;
while(low 0.9)
{
high = middle - 1;
continue;
}
if (Math.Abs(arr[middle] - lowerBound) < 0.9)
{
if (Math.Abs(arr[middle - 1] - lowerBound) < 0.9)
{
low = middle - 1;
continue;
}
return middle;
}
}
return -1;
}
static int findUpperBound(double[] arr, double upperBound)
{
int low = 0;
int high = arr.Length - 1;
while (low 0.9)
{
high = middle - 1;
continue;
}
else if (Math.Abs(arr[middle] - upperBound) < 0.9)
{
if (Math.Abs(arr[middle + 1] - upperBound) < 0.9)
{
low = middle + 1;
continue;
}
else
{
return middle;
}
}
}
return -1;
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... to-find-al