合并排序不起作用。 [英] Merge sort doesn't work.
本文介绍了合并排序不起作用。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在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屋!
查看全文