2011-03-09 59 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