#include #include #include #define max_size 10000
void merge(int* a, int* b,int start, int middle, int end)
else
}if (na1 <= middle)
}if (na2 <= end)
}for (i = start; i <= end; i++)
}void merge_sort(int* a, int* b, int start, int end)
}int main(int argc,char *argv)
fpread = fopen(argv[1], "r");
if (fpread == null)
for (i = 0; !feof(fpread); i++)
mpi_init(null, null);
mpi_comm_size(mpi_comm_world, &comm_sz);
mpi_comm_rank(mpi_comm_world, &my_rank);
size = length / comm_sz; // 計算每個程序所需陣列的大小
sub = (int *)malloc(size * sizeof(int)); // 為程序所用陣列開闢空間
mpi_scatter(arr, size, mpi_int, sub, size, mpi_int, 0, mpi_comm_world); // 將陣列元素分發給每個程序
tmp = (int *)malloc(size * sizeof(int)); // 開闢歸併排序時需要的臨時陣列
merge_sort(sub, tmp, 0, size - 1);
if(my_rank == 0)
mpi_gather(sub, size, mpi_int, result, size, mpi_int, 0, mpi_comm_world); // 將各程序排序的陣列收集到0號程序
if (my_rank == 0)
printf("\n");
free(result);
free(tmp_for_last);
}free(sub);
free(tmp);
mpi_finalize();
return 0;
}
在linux環境下,使用以下命令生成可執行檔案
mpicc -g -wall -o 檔名 檔名.c
測試命令
mpiexec -n 9 ./檔名 input.txt
MPI並行實現列舉排序
mpi並行實現列舉排序,如下 include include include 函式名 main 功能 主函式,實現列舉排序 輸入 argc為命令列引數個數 argv為每個命令列引數組成的字串陣列 輸出 返回1代表程式正常結束 int main int argc,char argv else if m...
歸併排序運用 逆序對
假設公升序為預設的序列,在乙個陣列中,陣列的任意一對數字逆序即inum j 則稱這一數對為逆序數對 給定乙個陣列,求該陣列的逆序數對 陣列中的逆序對 示例 輸入 7 5 6 4 5第一想法是暴力求解,暴力的時間複雜度是o n 2 會超時 採用歸併排序來優化時間複雜度 歸併排序是通過將陣列分治,再將兩...
歸併排序實現
1,我認為歸併排序是分治思想的運用,先是把要排序的數列分成兩半,分別對這兩半進行歸併排序,一步步分下去,當分到規模為1時,開始合併兩個已經有序的陣列。2,主要的 是兩個已經有序的陣列的合併,其中涉及的有空間申請的問題和哨兵的使用。具體看 這是初寫的 存在的問題有每次迭代都申請了空間且沒釋放,而且沒有...