Без сортировки массива arr
, но с использованием отсортированной дополнительной коллекции, содержащей самые высокие числа, найденные в любое время:
double[] arr = new double[5] { 12.1, 5.9, 2.9, 6.8, 20.5 };
int num = 3;
var lst = new List<double>();
foreach (double n in arr)
{
if (lst.Count < num)
{
lst.Add(n);
lst.Sort();
}
else if (n >= lst[0])
{
lst[0] = n;
lst.Sort();
}
}
foreach (double n in lst)
{
Console.WriteLine(n);
}
Без использования какой-либо сортировки, а просто с помощью функции поиска индекса-самого-нижнего элемента:
static int LowestIndex(double[] dbl)
{
if (dbl.Length == 0)
{
return -1;
}
int minIx = 0;
for (int i = 1; i < dbl.Length; i++)
{
if (dbl[i] < dbl[minIx])
{
minIx = i;
}
}
return minIx;
}
тогда
double[] arr = new double[5] { 12.1, 5.9, 2.9, 6.8, 20.5 };
int num = 3;
var lst = new List<double>();
int minIx = -1;
foreach (double n in arr)
{
if (lst.Count < num)
{
lst.Add(n);
continue;
}
if (minIx == -1)
{
minIx = LowestIndex(arr);
}
if (n >= arr[minIx])
{
lst[minIx] = n;
minIx = -1;
}
}
foreach (double n in lst)
{
Console.WriteLine(n);
}
Аналогично предыдущему, но вместо сортировки списка lst
и рассмотрения элемента с индексом [0]
наименьшим, мы используем метод LowestIndex
... Обратите внимание, что для того, чтобы сделать все более интересным, я "кэшировать", когда это возможно, результат LowestIndex
.
Третий способ, аналогичный первому: lst
сохраняется отсортированным «вручную» (поэтому, когда мы добавляем новый элемент в lst
, мы добавляем его в «правильном» положении, чтобы сохранять lst
отсортированным) ... Гораздо сложнее :-) Обратите внимание, что я использую List<T>.BinarySearch
, который имеет "очень интересный" способ возврата индекса, когда точное совпадение не найдено.
double[] arr = new double[] { 30, 1, 1, 12.1, 5.9, 2.9, 6.8, 20.5 };
int num = 3;
var lst = new List<double>();
foreach (double n in arr)
{
int ix = lst.BinarySearch(n);
if (ix < 0)
{
ix = ~ix;
}
if (ix == 0 && lst.Count == num)
{
continue;
}
if (lst.Count == num)
{
lst.RemoveAt(0);
ix--;
}
lst.Insert(ix, n);
}
foreach (double n in lst)
{
Console.WriteLine(n);
}