排序数字数组问题

时间:2011-03-09 22:24:44

标签: c# arrays sorting

我在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?
    }
}

2 个答案:

答案 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;
    }
}