我在c#中遇到数组问题。例如,我们有一个用于存储索引的数组(数组长度为0-99),一个数组用于随机生成的数字(数组长度为0-99)和数组用于频率(多少时间数字重复)。
实施例
i:0 1 2 3 4 ... i - 指数
n:5 2 1 2 0 ... n - 数字
f:1 1 2 1 0 ... f - 频率
它是计算排序的一部分。下面我们还有另一个例子,我想如何排序 没有计算机计算
我: 0 1 2 3 4 ...
n:5 2 1 2 0 ...
f: 1 1 2 1 0 ...
s:0 1 2 2 3 ... s - 已排序
- >频率告诉我们有多少0,1,...有,我们只写下来
int[] arr = new int[100]; //generated numbers
int[] arr2 = new int[100]; //sorted array
int[] counter = new int[100]; //frequencies
//frequencies
for (int i = 0; i < st_el; i++)
{
counter[arr[i]] += 1;
}
for(int i=0; i<arr.length; i++)
{
for(int j=0; j<arr.length; j++)
{
//I do not know how to implement?
}
}
答案 0 :(得分:0)
使用LINQ你可以这样做:
var frequencies = numbers.GroupBy(n => n)
.Select(g => new { Number = g.Key, Frequency = g.Count() })
.ToList();
foreach (var item in frequencies)
{
Console.WriteLine("Number {0} occurs {1} times", item.Number, item.Frequency);
}
这将为您提供数字数组中每个数字的频率 - 我认为这就是您想要的。
修改强>
我想我现在明白了:你是counting sort部分本身 - 考虑到你只有0到99之间的随机数的例子,你只需要检查计数数组的每个元素检查特定号码的出现次数,然后多次重复该号码(未经测试):
int index = 0;
for(int i=0; i< counter.length; i++)
{
for(j=index;j<index+counter[i];j++)
arr2[j] = i;
index+=counter[i];
}
答案 1 :(得分:0)
我根本不会使用数组。我几乎没有使用它们,特别是考虑到(我假设)你对阵列长度的人为限制。
以下是我将如何处理它,假设你至少使用.Net 3.5:
class Program
{
static void Main(string[] args)
{
var sorted = new List<int>();
var frequencies = new Dictionary<int, int>();
//Get a bunch of random numbers
var numbers = GetSomeRandomNumbers(100);
//Sort the numbers asscenting
foreach (var number in numbers.OrderBy(i => i))
{
//This will add the numbers in the expected order
sorted.Add(number);
//Frequencies is just a lookup table of number -> frequency
if (frequencies.ContainsKey(number))
frequencies[number]++;
else
frequencies.Add(number, 1);
}
Console.WriteLine("--SORTED--");
sorted.ForEach(number => Console.WriteLine(number));
Console.WriteLine("--FREQUENCIES--");
//Dump all of the frequencies as a quick test
frequencies.ToList().ForEach(pair => Console.WriteLine(string.Format("{0} occurrences of {1}", pair.Value, pair.Key)));
//Wiat
Console.ReadLine();
}
private static List<int> GetSomeRandomNumbers(int count)
{
var random = new Random();
var result = new List<int>();
for (int i = 0; i < count; i++)
result.Add(random.Next(0, 100));
return result;
}
}