练习:
练习要求使用 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 排序在数组中搜索最高十进制数。
答案 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();
}
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 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);
}
}
输出:
答案 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
如果您不想使用排序技术,那么您可以尝试使用以下方法
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
不要错过添加System.Linq
,System.Collections.Generic
命名空间。