Найти количество n старших значений в несортированном двойном (десятичном) массиве без сортировки - PullRequest
0 голосов
/ 16 мая 2018

Упражнение:

Для выполнения упражнения требуется сортировка NO , например. в порядке убывания. Мне нужно найти самые высокие значения из массива, как есть.

Пример:

double[] arr = new double[5] {12.1, 5.9, 2.9, 6.8, 20.5}

Запросить номер = 3

Я не знаю, как делать вычисления.

Самые высокие значения

20.5, 12.1, 6.8

Из того, что я понимаю, мне нужно спросить у пользователя номер. Из этого числа создайте способ поиска в массиве по наибольшему десятичному числу с помощью сортировки NO .

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

Без сортировки массива 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);
}
0 голосов
/ 16 мая 2018

OP: программа, которая будет искать несортированный двойной массив, т. Е. Десятичные числа, для количества n старших десятичных значений. N определяется пользователем. Например, пользователь вводит число 3, программа должна отображать 3 старших десятичных значения из массива.

Используя LINQ OrderByDescending и Take таким образом:

public static void Main()
{
        double[] array = new double[5] {12.1, 5.9, 2.9, 6.8, 20.5};

        Console.WriteLine("Enter input:");              // Prompt for input
        string input = Console.ReadLine();       

        int totalNums = Convert.ToInt32(input);

        //sort the array in descending order and get 
        //the desired number of elements out of it

        var topNumbers = array.OrderByDescending(i => i) 
                    .Take(totalNums);
        foreach (var x in topNumbers)
        {
            Console.WriteLine(x);
        }
    }

ВЫВОД:

enter image description here

dotNetFiddle

0 голосов
/ 16 мая 2018

Вы также можете попробовать этот подход

1.Сортируйте массив в порядке убывания.

2. Цикл для первого n элемента, чтобы получить n старших чисел из массива.

double[] arr = { 2.1, 70.1, 15.1, 92.1, 105.1, 65.1, 40.1, 9.1, 22.1 };
int n = 3; //This you can take it from user by using Console.ReadLine()
double[] result = arr.OrderByDescending(x=>x).ToArray();
//Result will contais {105, 92, 70, 65, 40, 22, 15, 9, 2}
//More readable to newbie 
Console.WriteLine("Top {0} elements from Array", n);
for(int i = 0; i < n; i++)
    {
      Console.Write(result[i]+" ");
    }

Output:
Top 3 elements from Array
105.1 92.1 70.1

DotNetFiddler


Если вы не хотите использовать метод сортировки , то вы можете попробовать следующий подход

double[] arr = { 2.1, 70.1, 15.1, 92.1, 105.1, 65.1, 40.1, 9.1, 22.1 };     
int n = 3;
List<double> list = new List<double>(arr);
Console.WriteLine("Top {0} elements", n);
for(int i = 0; i < n; i++)
    {
      double max = list.Max();  
      Console.WriteLine(max);
      list.Remove(max);
    }

Output:Top 3 elements
105.1
92.1
70.1

DotNetFiddler

Не пропустите добавить System.Linq, System.Collections.Generic пространство имен.

0 голосов
/ 16 мая 2018

OP: Как мне написать программу, которая будет искать в двойном массиве n значений старших значений. N определяется пользователем. Например, пользователь вводит число 3, программа должна отображать 3 самых высоких значения из массива.

Вы можете использовать LINQ OrderByDescending, чтобы упорядочить массив, а затем использовать LINQ Take, чтобы получить n самые высокие значения. Я также добавил int.TryParse(Console.ReadLine(), out n), чтобы проверить, является ли пользовательский ввод действительно целым числом, если нет, то пользователю снова предлагается ввести количество старших элементов, которые он хочет извлечь из массива.

static void Main()
{
    double[] arr = { 2.11, 70.22, 15.67, 92.88, 105.91, 65.32, 40.25, 9.11, 22.09 };

    int n;

    Console.WriteLine("Enter the number of highest elements you want to extract from the array:");

    while(!int.TryParse(Console.ReadLine(), out n))
    {
        Console.WriteLine("Enter the number of highest elements you want to extract from the array:");
    }

    double[] result = arr.OrderByDescending(x=>x).Take(n).ToArray();

    foreach (var item in result)
    {
        Console.WriteLine(item);
    }

    Console.ReadKey();
}

ДЕМО ЗДЕСЬ

result для n=4:

105,91

92,88

70,22

65,32

После того, как ОП отредактировал вопрос: Из того, что я понимаю, мне нужно спросить у пользователя номер. Из этого числа создайте способ поиска в массиве по наибольшему десятичному числу с помощью NO sort .

Вот решение без сортировки исходного массива:

static void Main()
{
    int i,n;
    Console.WriteLine("Enter the number of highest elements you want to extract from the array:");
    while (!int.TryParse(Console.ReadLine(), out n))
    {
        Console.WriteLine("Enter the number of highest elements you want to extract from the array:");
    }
    double[] arr = { 12.1, 5.9, 2.9, 6.8, 20.5 };
    if (n > arr.Length)
        n = arr.Length;
    double[] result = new double[n];
    double max = 0;
    int k;
    for (int j = 0; j < n; j++)
    {
        max = arr[0];
        k = 0;
        for (i = 1; i < arr.Length; i++)
        {
            if (max < arr[i])
            {
                max = arr[i];
                k = i;
            }
        }
        result[j] = max;
        arr[k] = Double.MinValue;

        Console.WriteLine("Highest numbers: {0}", result[j]);
    }
    Console.ReadKey();
}

ДЕМО ЗДЕСЬ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...