簡體   English   中英

排序數字數組問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM