[英]sorting numbers array question
我在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-頻率
這是計數排序的一部分。 下面是另一個示例,我想如何在不進行通信計算的情況下進行排序
i: 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?
}
}
使用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);
}
這將為您提供數字數組中每個數字的頻率-我想這就是您想要的。
編輯:
我想我現在明白了:您可以自己完成計數排序部分-給出的示例僅允許使用0到99之間的隨機數,您只需要檢查count數組的每個元素即可檢查出現次數特定號碼的號碼,然后重復該號碼多次(未經測試):
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];
}
我根本不會使用數組。 我幾乎從未使用過它們,尤其是考慮到您對陣列長度的人為限制(我假設)。
假設您至少使用.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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.