Member 12855422 Ответов: 1

Случайные элементы в коде сортировки массива


Помогите! У меня есть код, но я не знаю, откуда в программе берутся числа массивов. Я хочу создать массив случайных чисел, которые в программе сортируются, как я могу это сделать?

#include "stdafx.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
#include <iostream>
#include <windows.h>

//#define N 2

int compare(const void *, const void *);
void mergeArrays(int *, int *, int *, int, int);
int computeNeighbor(int, int, int);

int main(int argc, char ** argv)
{
	setlocale(LC_ALL, "Russian");

	int i, j, n, N, rank, size;
	MPI_Status status;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &size);
	do {
		std::cout << "Enter mass lenght: ";
		std::cin >> N;
	} while (N > 5000000);

	int numElements = N / size;
	int * arr = (int *)malloc(sizeof(int)*numElements);
	int * temp = (int *)malloc(sizeof(int)*numElements * 2);
	int * recvArr = (int *)malloc(sizeof(int)*numElements);
	int * fullArr = NULL;

	if (rank == 0)
		fullArr = (int *)malloc(sizeof(int)*N);

	//Fill array in descending order
	int start = rank*numElements;
	int end = start + numElements;
	for (i = 0, j = start; i < numElements; i++, j++)
		arr[i] = N - j;

	//Sort array with odd-even sort

	//Sort local values
	qsort(arr, numElements, sizeof(int), compare);

	//Begin iterations
	for (n = 0; n < size; n++) {
		MPI_Barrier(MPI_COMM_WORLD);
		int neighbor = computeNeighbor(n, rank, size);

		if (neighbor >= 0 && neighbor < size)
		{
			//Send my values to my neighbor and receive values from my neighbor
			MPI_Sendrecv(arr, numElements, MPI_INT, neighbor, n,
				recvArr, numElements, MPI_INT, neighbor, n,
				MPI_COMM_WORLD, &status);

			//If my rank < my neighbor's rank, keep the smaller values
			if (rank < neighbor) {
				mergeArrays(arr, recvArr, temp, numElements, 1);
				//Else keep the larger values
			}
			else {
				mergeArrays(arr, recvArr, temp, numElements, 0);
			}
		}
	}

	MPI_Barrier(MPI_COMM_WORLD);
	MPI_Gather(arr, numElements, MPI_INT, fullArr, numElements, MPI_INT, 0, MPI_COMM_WORLD);

	if (rank == 0)
	{
		for (i = 0; i < N; i++)
			printf("%d ", fullArr[i]);
		printf("\n");
	}

	free((void *)arr);
	free((void *)recvArr);
	free((void *)temp);

	MPI_Finalize();
	system("pause");
	return 0;
}

int compare(const void * a, const void * b)
{
	if (*((int *)a) <  *((int *)b)) return -1;
	else if (*((int *)a) == *((int *)b)) return 0;
	else return 1;
}

int computeNeighbor(int phase, int rank, int size)
{
	int neighbor;
	if (phase % 2 != 0) {  //odd phase
		if (rank % 2 != 0) {  //odd rank
			neighbor = rank + 1;
		}
		else {  //even rank
			neighbor = rank - 1;
		}
	}
	else {  //even phase
		if (rank % 2 != 0) {  //odd rank
			neighbor = rank - 1;
		}
		else {  //even rank
			neighbor = rank + 1;
		}
	}

	if (neighbor < 0 || neighbor >= size)
		neighbor = -1;
	return neighbor;
}

void mergeArrays(int * arr, int * neighborArr, int * temp, int size, int low_or_high)
{
	int i, j, k;
	i = j = k = 0;

	//Assume arrays are already sorted
	for (i = 0, j = 0, k = 0; i < size * 2; i++)
	{
		if (j < size && k < size)
		{
			if (arr[j] < neighborArr[k])
			{
				temp[i] = arr[j];
				j++;
			}
			else {
				temp[i] = neighborArr[k];
				k++;
			}
		}
		else if (j < size) {
			temp[i] = arr[j];
			j++;
		}
		else {
			temp[i] = neighborArr[k];
			k++;
		}
	}

	if (low_or_high % 2 != 0)
		for (i = 0; i < size; i++)
			arr[i] = temp[i];
	else
		for (i = size, j = 0; j < size; i++, j++)
			arr[j] = temp[i];
}


Что я уже пробовал:

Я не знаю, где в этом коде создать массив.

1 Ответов

Рейтинг:
8

Rick York

Всего создано четыре массива. Сразу после строки, которая вычисляет numElements, есть четыре malloc, и они выделяют массивы в памяти.


Member 12855422

Спасибо! Но я не понимаю, откуда берутся числа. В этой программе я вижу: "1 2 3 4 5 6", Если N = 6, или "1 2 3", Если N = 3, где я могу изменить его на:" 421 432 123", если N = 3 и т. д.

Member 12855422

Не берите в голову. Спасибо!