運用MPI並行實現歸併排序

2021-08-21 11:15:10 字數 1352 閱讀 6374

#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,主要的 是兩個已經有序的陣列的合併,其中涉及的有空間申請的問題和哨兵的使用。具體看 這是初寫的 存在的問題有每次迭代都申請了空間且沒釋放,而且沒有...