typedef long long __int64;#include "mpi.h"#include #include #include using namespace std;int Compute_partner(int phase,int my_rank,int comm_sz){//根据趟数的奇偶性以及当前编号的编号得到partner进程的编号 int partner; if(!(phase&1)){ if(my_rank&1){ partner=my_rank-1; } else{ partner=my_rank+1; } } else{ if(my_rank&1){ partner=my_rank+1; } else{ partner=my_rank-1; } } if(partner==-1 || partner==comm_sz){ partner=MPI_PROC_NULL; } return partner;}int main(int argc, char* argv[]){ int my_rank=0, comm_sz=0; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); MPI_Comm_size(MPI_COMM_WORLD, &comm_sz); int np,n,local_n;//分别为进行奇偶交换排序的趟数和读入的数据总量以及分成的每段的长度 FILE* fp; if(my_rank==0){ fp=fopen("Sort.txt","r"); fscanf(fp,"%d%d",&np,&n); local_n=n/comm_sz; } MPI_Bcast(&np,1,MPI_INT,0,MPI_COMM_WORLD); MPI_Bcast(&local_n,1,MPI_INT,0,MPI_COMM_WORLD); int* keys; int* my_keys=new int[local_n]; if(my_rank==0){ keys=new int[n]; for(int i=0;i my_keys[j+1]){ swap(my_keys[j],my_keys[j+1]); } } } else{ for(int j=1;j+1 my_keys[j+1]){ swap(my_keys[j],my_keys[j+1]); } } } } int* recv_keys=new int[local_n]; int* temp_keys=new int[local_n]; for(int i=0;i =0){ if(my_keys[e1]>=recv_keys[e2]){ temp_keys[e]=my_keys[e1]; --e; --e1; } else{ temp_keys[e]=recv_keys[e2]; --e; --e2; } } for(int j=0;j