Сортировка слиянием используя MPI - C#
Формулировка задачи:
Прошу помощи - есть код на C# сортировка одномерного массива методом слияния (merge sort). Необходимо переписать его используя MPI, как это сделать?
static int[] Sort(int[] arraySort)
{
//проверка длины массива
//если длина равна 1, то возвращаем массив,
//так как он не нуждается в сортировке
if (arraySort.Length > 1)
{
//массивы для хранения половинок входящего буфера
int[] left = new int[arraySort.Length / 2];
//для проверки ошибки некорректного разбиения массива,
//в случае если длина непарное число
int[] right = new int[arraySort.Length - left.Length];
//заполнение субмассивов данными из входящего массива
for (int i = 0; i < left.Length; i++)
{
left[i] = arraySort[i];
}
for (int i = 0; i < right.Length; i++)
{
right[i] = arraySort[left.Length + i];
}
//если длина субмассивов больше еденици,
//то мы повторно (рекурсивно) вызываем функцию разбиения массива
if (left.Length > 1)
left = Sort(left);
if (right.Length > 1)
right = Sort(right);
//сортировка слиянием половинок
arraySort = MergeSort(left, right);
}
//возврат отсортированного массива
return arraySort;
}
static int[] MergeSort(int[] left, int[] right)
{
//буфер для отсортированного массива
int[] arraySort = new int[left.Length + right.Length];
//счетчики длины трех массивов
int i = 0; //соединенный массив
int l = 0; //левый массив
int r = 0; //правый массив
//сортировка сравнением элементов
for (; i < arraySort.Length; i++)
{
//если правая часть уже использована, дальнейшее движение происходит только в левой
//проверка на выход правого массива за пределы
if (r >= right.Length)
{
arraySort[i] = left[l];
l++;
}
//проверка на выход за пределы левого массива
//и сравнение текущих значений обоих массивов
else if (l < left.Length && left[l] < right[r])
{
arraySort[i] = left[l];
l++;
}
//если текущее значение правой части больше
else
{
arraySort[i] = right[r];
r++;
}
}
//возврат отсортированного массива
return arraySort;
}Решение задачи: «Сортировка слиянием используя MPI»
textual
Листинг программы
using (new MPI.Environment(ref args))
{
Intracommunicator comm = Communicator.world;
ProcNum = comm.Size;
ProcRank = comm.Rank;
if (ProcRank == 0)
{
for (i = 0; i < array.Length; i++)
{
array[i] = rand.Next(10000);
arraySort[i] = array[i];
// Console.WriteLine(array[i]);
}
}
Console.WriteLine("Сортировка масива..");
if (array.Length > 1) arraySort = Sort(arraySort);
}