Итак, я экспериментировал с рекурсивной сортировкой по радикалам 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, когда происходит исключение, и я не могу понять, как оно может увеличиться до этого.Я ценю любого, кто решит помочь!