合并排序不起作用。 [英] Merge sort doesn't work.

查看:60
本文介绍了合并排序不起作用。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在MPI有一个合并排序代码:



I have a code of merge sort at MPI:

#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <cstdlib>
#include <time.h>

#include "mpi.h"

#pragma comment (lib, "msmpi.lib")

using namespace std;


void merge(int *, int *, int, int, int);
void mergeSort(int *, int *, int, int);

int main(int argc, char** argv) {

	/********** Create and populate the array **********/

	int n = atoi(argv[1]);
	//int *original_array = malloc(n * sizeof(int));
	int *original_array = reinterpret_cast<int*>(malloc(n * sizeof(int)));
	int c;
	srand(time(NULL));
	printf("This is the unsorted array: ");
	for (c = 0; c < n; c++) {

		original_array[c] = rand() % n;
		printf("%d ", original_array[c]);

	}

	printf("\n");
	printf("\n");

	/********** Initialize MPI **********/
	int world_rank;
	int world_size;

	MPI_Init(&argc, &argv);
	MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
	MPI_Comm_size(MPI_COMM_WORLD, &world_size);

	/********** Divide the array in equal-sized chunks **********/
	int size = n / world_size;

	/********** Send each subarray to each process **********/
	int *sub_array = reinterpret_cast<int*>(malloc(n * sizeof(int)));

	MPI_Scatter(original_array, size, MPI_INT, sub_array, size, MPI_INT, 0, MPI_COMM_WORLD);

	/********** Perform the mergesort on each process **********/
	int *tmp_array = reinterpret_cast<int*>(malloc(n * sizeof(int)));
	mergeSort(sub_array, tmp_array, 0, (size - 1));

	/********** Gather the sorted subarrays into one **********/
	int *sorted = NULL;
	if (world_rank == 0) {

		sorted == malloc(n * sizeof(int));

	}

	MPI_Gather(sub_array, size, MPI_INT, sorted, size, MPI_INT, 0, MPI_COMM_WORLD);

	/********** Make the final mergeSort call **********/
	if (world_rank == 0) {
		int *other_array = reinterpret_cast<int*>(malloc(n * sizeof(int)));

		mergeSort(sorted, other_array, 0, (n - 1));

		/********** Display the sorted array **********/
		printf("This is the sorted array: ");
		for (c = 0; c < n; c++) {

			printf("%d ", sorted[c]);

		}

		printf("\n");
		printf("\n");

		/********** Clean up root **********/
		//free(sorted);
		delete[] sorted;
		delete[] other_array;
		//free(other_array);

	}

	/********** Clean up rest **********/
	//free(original_array);
	//free(sub_array);
	//free(tmp_array);
	delete[] original_array;
	delete[] sub_array;
	delete[] tmp_array;

	/********** Finalize MPI **********/
	MPI_Barrier(MPI_COMM_WORLD);
	MPI_Finalize();

	system("pause");

}

/********** Merge Function **********/
void merge(int *a, int *b, int l, int m, int r) {

	int h, i, j, k;
	h = l;
	i = l;
	j = m + 1;

	while ((h <= m) && (j <= r)) {

		if (a[h] <= a[j]) {

			b[i] = a[h];
			h++;

		}

		else {

			b[i] = a[j];
			j++;

		}

		i++;

	}

	if (m < h) {

		for (k = j; k <= r; k++) {

			b[i] = a[k];
			i++;

		}

	}

	else {

		for (k = h; k <= m; k++) {

			b[i] = a[k];
			i++;

		}

	}

	for (k = l; k <= r; k++) {

		a[k] = b[k];

	}

}

/********** Recursive Merge Function **********/
void mergeSort(int *a, int *b, int l, int r) {

	int m;

	if (l < r) {

		m = (l + r) / 2;

		mergeSort(a, b, l, m);
		mergeSort(a, b, (m + 1), r);
		merge(a, b, l, m, r);

	}

}





但是当我启动程序时它会关闭并且这是全部了。我该如何解决这个问题?



我的尝试:



系统( 暂停); - 不工作,控制台出现在1-2秒。

MPI连接。



But when I start the programm it shutdown and it is all. How I can fix that?

What I have tried:

system("pause"); - don't work, console appear in 1-2 sec.
MPI connect.

推荐答案

首先:不要混合malloc并删除。使用new和delete,因为它们具有C ++的现代命令。



第二:你的排序数组没有初始化。



第三个也是最后一个:学会在IDE中使用调试器。观看一些 Youtube上的视频进行学习。
At first: dont mix malloc and delete. Use new and delete, because they have the modern commands for C++.

Second: your arrays for sorting arent initialized.

Third and last: learn to use the debuggeron your IDE. Watch some videos on Youtube for learning it.


这篇关于合并排序不起作用。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆