сортировка чисел - PullRequest
       10

сортировка чисел

0 голосов
/ 10 марта 2011

У меня проблема с массивами в 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?
    }
}

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Я бы вообще не использовал массивы. Я почти никогда не использую их, особенно учитывая (я предполагаю) искусственные ограничения, которые у вас есть на длину массива.

Вот как я бы справился с этим, если вы используете хотя бы .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;
    }
}
0 голосов
/ 10 марта 2011

используя 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);
}

Это даст вам частоту каждого числа в массиве чисел - я думаю, что это то, что вы хотите.

Edit:

Кажется, теперь я понимаю: вы до счетной сортировки самой части - учитывая, что в вашем примере допустимы только случайные числа от 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...