2011-03-09 50 views
0

我在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 - 频率

它是计数排序的一部分。和下面,我们有另一个一例怎么想而不COMULATIVE计算

i到排序 : 1 2 3 4 ...
N:5 2 1 2 0 ...
˚F : 1 2 1 0 ...
S:0 1 2 2 3秒 - 分类

- >频告诉我们有多少0,1,...在那里,我们只写it down

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

我不太明白的问题是什么,你能澄清要排序,其中阵列什么办法? – BrokenGlass 2011-03-09 22:44:44

+0

你想排序的数组,'arr2'是他们被引用的频率顺序的商店编号?但是在你的例子中's'数组根本没有意义。请解释你正在尝试做什么。 – 2011-03-09 22:54:53

回答

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]; 
} 
+0

谢谢你的回答,但不幸的是,这不是我正在寻找的。我忘了写我需要算法没有任何其他方法或其他任何东西。 – Strausa 2011-03-09 22:58:54

+0

@Strausa:检查我的编辑,这可能足以让你开始并验证自己 - 我认为这是作业 – BrokenGlass 2011-03-09 23:01:00

+0

是的,它是我家庭作业的一部分,但我没有任何成功地坐在这个任务的前面。我将尝试自己完成这项工作以进行培训。感谢您的咨询 – Strausa 2011-03-09 23:11:43

0

我不会在所有使用数组。我很少使用它们,尤其是考虑到(我假设)在数组长度上的人为限制。

这是我将如何处理它,asuming您使用至少净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; 
    } 
} 
+0

你会发现你的随机数字在你的实现中不会如此随机 – BrokenGlass 2011-03-09 23:03:50

+0

谢谢布兰登,我会把它写下来进行练习。 – Strausa 2011-03-09 23:05:31