Реализация
Функция MergeSortUp - осуществляет сортировку массива по возрастанию
void MergeSortUp(int* ar, int n) //ar - указатель на начало массива, n - число элементов в массиве
{
  if (n>1)
  {
    int split=n/2;
    MergeSortUp(ar,split);
    MergeSortUp(&ar[split],split+n%2);
    MergeUp(ar,split,&ar[split],split+n%2);
  }
};
Функция MergeUP сливает два отсортированных по возрастанию массива
void MergeUp(int* ar1, int n1, int* ar2, int n2)
{
  int* buf=new int[n1+n2];
  int i=0,j=0,pos=0;
  while ((i
  {
    if (ar1[i]>ar2[j])
    {
      buf[pos]=ar2[j];
      j++;
    }
    else
    {
      buf[pos]=ar1[i];
      i++;
    }
    pos++;
  }
  if (i==n1) //Разобрались с остатком
    for (i=j; i
    {
      buf[pos]=ar2[i];
      pos++;
    }
  else
    for (j=i; j
    {
      buf[pos]=ar1[j];
      pos++;
    }
  for (i=0; i
    ar1[i]=buf[i];
  delete[] buf;
};
Основное тело программы
if (numberofprocess==1) //Если у нас только один поток - просто взяли и отсортировали
    MergeSortUp(ar,n);
  else //Иначе - распределяем данные
  {
    MPI_Bcast(&n,1,MPI_UNSIGNED,0,MPI_COMM_WORLD);
    Counts=new int[numberofprocess];
    displs=new int[numberofprocess];
    displs[0]=0;
    int count=n/numberofprocess, ost=n%numberofprocess;
    for (int i=0; i
    {
      Counts[i]=count;
      if (ost>0)
      {
        Counts[i]++;
        ost--;
      }
      if (i>0)
        displs[i]=displs[i-1]+Counts[i-1];
    }
    myn=Counts[myrank];
    WorkingArray=new int[myn];
    if (myrank!=0)
      ar=new int[n];
    MPI_Scatterv(ar,Counts,displs,MPI_UNSIGNED,WorkingArray,n,MPI_UNSIGNED,0,MPI_COMM_WORLD); //Рассылаем
    MergeSortUp(WorkingArray,myn); //Сортируем
    MPI_Gatherv(WorkingArray,Counts[myrank],MPI_UNSIGNED,ar,Counts,displs,MPI_UNSIGNED,0,MPI_COMM_WORLD); //Собираем
  }
  if (myrank==0)
  {
    //cout << numberofprocess << endl;
    for (int i=0; i
    {
      MergeUp(ar,Counts[i],&ar[displs[i+1]],Counts[i+1]);
      Counts[i+1]+=Counts[i];
    }
  }
|