Переменная счетчика в моем MSD Radix Sort превышает верхнюю границу - PullRequest
0 голосов
/ 05 мая 2019

Итак, я экспериментировал с рекурсивной сортировкой по радикалам MSD (наиболее значимая цифра).Цель такого рода - как можно быстрее отсортировать 500 000 случайных целых чисел (по числам, которые я сгенерирую сам. Границы сгенерированных чисел находятся в диапазоне от 0 до MaxValue. Таким образом, в приведенном ниже коде вы передадите миллион для множествакогда вы вызываете функцию).Я пытаюсь реализовать асинхронные операции с классом Tasks, но по какой-то причине переменная счетчика в моем цикле for принимает значения до 10, когда я устанавливаю значение от 0 до 9. Запуск кода возвращает меня назад «Индекс был внеграницы массива ", так как у меня есть переменная counter, доступ к массиву размером всего 10 единиц.Вот код моей функции сортировки MSD Radix:

public static List<int> MSDRadixSort(List<int> RandommNumbers, int mult)
        {
            List<int>[] Buckets = new List<int>[10];
            int[] RandomNumbers = RandommNumbers.ToArray();

            int singleDigit = 0;
            int[] temp;

            Buckets[0] = new List<int>();
            Buckets[1] = new List<int>();
            Buckets[2] = new List<int>();
            Buckets[3] = new List<int>();
            Buckets[4] = new List<int>();
            Buckets[5] = new List<int>();
            Buckets[6] = new List<int>();
            Buckets[7] = new List<int>();
            Buckets[8] = new List<int>();
            Buckets[9] = new List<int>();

            temp = (int[])RandomNumbers.Clone();

            for (int i = 0; i < temp.Length; i++)
            {
                temp[i] /= mult;
            }

            for (int i = 0; i < temp.Length; i++)
            {
                singleDigit = temp[i] % 10;

                Buckets[singleDigit].Add(RandomNumbers[i]);
            }

            if (mult == 1)
            {
                List<int> NewList = new List<int>(SIZE);

                for (int i = 0; i < 10; i++)
                {
                    NewList.AddRange(Buckets[i]);
                }

                return NewList;
            }
            else
            {
                var tasks = new Task<List<int>>[10];
                for (int i = 0; i < 10; i++)
                {
                    if(Buckets[i].Count == 1)
                    {
                        continue;
                    }
                    else
                    {
                        if (mult != 1)
                        {
                            tasks[i] = Task.Run(() => MSDRadixSort(Buckets[i], mult /= 10));
                        }
                        else
                        {
                            tasks[i] = Task.Run(() => MSDRadixSort(Buckets[i], mult));
                        }
                    }
                }

                List<int> NewList = new List<int>(SIZE);

                foreach (var task in tasks)
                {
                    NewList.AddRange(task.Result);
                }

                return NewList;
            }
        }

Специфический раздел, который доставляет мне проблемы, таков:

var tasks = new Task<List<int>>[10];
for (int i = 0; i < 10; i++)
{
    if(Buckets[i].Count == 1)
    {
        continue;
    }
    else
    {
        if (mult != 1)
        {  
            //This is the line where the exception happens
            tasks[i] = Task.Run(() => MSDRadixSort(Buckets[i], mult /= 10));
        }
        else
        {
            tasks[i] = Task.Run(() => MSDRadixSort(Buckets[i], mult));
        }
    }
}

По какой-то причине переменная счетчика (i) находится в10, когда происходит исключение, и я не могу понять, как оно может увеличиться до этого.Я ценю любого, кто решит помочь!

...