使用NO排序查找未排序的双(小数)数组中的n个最高值

时间:2018-05-16 06:16:36

标签: c# arrays double user-input

练习:

练习要求使用 NO 排序,例如降序排列。我需要按原样从数组中找到最高值。

示例:

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

向用户询问number = 3

我不知道如何进行计算。

最高值是

20.5, 12.1, 6.8

据我所知,我需要向用户询问一个号码。从该数字创建一种方法,通过 NO 排序在数组中搜索最高十进制数。

4 个答案:

答案 0 :(得分:3)

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();
}

DEMO HERE

result

n=4

105.91

92.88

70.22

65.32

OP之后编辑问题: 据我所知,我需要向用户询问一个号码。从该数字创建一种方法,使用 NO排序在数组中搜索最高十进制数。

这是一个没有对初始数组进行排序的解决方案:

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();
}

<强> DEMO HERE

答案 1 :(得分:2)

不对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);
}

不使用任何排序,只是使用find-the-the-the-the-element元素:

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方法...注意到使一切更有趣,我&#34;缓存&#34;在可能的情况下LowestIndex结果。

第三种方式,类似于第一种方式:lst保持排序&#34;手动&#34; (因此,当我们向lst添加新元素时,我们将其添加到&#34;右侧&#34;位置以保持lst排序... ...更复杂:-)请注意我和#39; m使用List<T>.BinarySearch,其中有一个非常有趣的&#34;找不到完全匹配时返回索引的方法。

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);
}

答案 2 :(得分:1)

OP:一个程序,它将搜索未排序的双数组,即n个最高十进制值的十进制数。 n由用户确定。例如,用户输入数字3,程序需要显示数组中的3个最高十进制值。

以这种方式使用LINQ OrderByDescendingTake

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

答案 3 :(得分:1)

您也可以尝试这种方法

1.按降序排列数组。

2.Loop for first n element从数组中获得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.LinqSystem.Collections.Generic命名空间。