From 1410179f9c06420072d117b4381a100797a50e34 Mon Sep 17 00:00:00 2001 From: 13518104 Kevin Austin Stefano <13518104@std.stei.itb.ac.id> Date: Fri, 5 Mar 2021 01:16:45 +0700 Subject: [PATCH] add QS to MPI, MP, Serial --- src/MST_OpenMP | Bin 0 -> 13120 bytes src/MST_OpenMP.c | 88 +++++++++++++++++++++++++++++++++++++++++++++ src/MST_OpenMPI | Bin 13200 -> 17408 bytes src/MST_OpenMPI.c | 10 +++--- src/MST_Serial.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++ src/hello | Bin 8600 -> 0 bytes 6 files changed, 183 insertions(+), 5 deletions(-) create mode 100755 src/MST_OpenMP delete mode 100755 src/hello diff --git a/src/MST_OpenMP b/src/MST_OpenMP new file mode 100755 index 0000000000000000000000000000000000000000..1cb0a282693bdf20d9286e778158fc9f0b8e5669 GIT binary patch literal 13120 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 literal 0 HcmV?d00001 diff --git a/src/MST_OpenMP.c b/src/MST_OpenMP.c index f71ec19..cfa88ea 100644 --- a/src/MST_OpenMP.c +++ b/src/MST_OpenMP.c @@ -46,7 +46,95 @@ void PrintGraph(Graph *graph) printf("%d -- %d = %d\n", graph->edge[i].src, graph->edge[i].dest, graph->edge[i].weight); } } +void PartisiSrc(Edge T[], int i, int j, int *k) +{ + Edge pivot = T[i - 1]; + int p = i; + int q = j; + while (p <= q) + { + while (T[p - 1].src < pivot.src) + { + p++; + } + while (T[q - 1].src > pivot.src) + { + q--; + } + if (p < q) + { + Edge temp = T[p - 1]; + T[p - 1] = T[q - 1]; + T[q - 1] = temp; + p++; + q--; + } + else if (p == q) + { + p++; + } + } + *k = q; +} + +// Mengurutkan array dengan menggunakan Quick Sort +void QuickSortSrc(Edge T[], int i, int j) +{ + int k; + if (i < j) + { + PartisiSrc(T, i, j, &k); + // PrintArray(T, i, k); + // PrintArray(T, k + 1, j); + QuickSortSrc(T, i, k); + QuickSortSrc(T, k + 1, j); + } +} +void PartisiWeight(Edge T[], int i, int j, int *k) +{ + Edge pivot = T[i - 1]; + int p = i; + int q = j; + while (p <= q) + { + while (T[p - 1].weight < pivot.weight) + { + p++; + } + while (T[q - 1].weight > pivot.weight) + { + q--; + } + if (p < q) + { + Edge temp = T[p - 1]; + T[p - 1] = T[q - 1]; + T[q - 1] = temp; + p++; + q--; + } + else if (p == q) + { + p++; + } + } + *k = q; +} + +// Mengurutkan array dengan menggunakan Quick Sort +void QuickSortWeight(Edge T[], int i, int j) +{ + int k; + if (i < j) + { + PartisiWeight(T, i, j, &k); + // PrintArray(T, i, k); + // PrintArray(T, k + 1, j); + QuickSortWeight(T, i, k); + QuickSortWeight(T, k + 1, j); + } +} // A function to implement bubble sort void bubbleSort(Edge arr[], int n, int type) { diff --git a/src/MST_OpenMPI b/src/MST_OpenMPI index 556099513aad8e81d4c4db15ab75e054b12b7459..eb441f46946f1c69a252c28dbd476ec82c871769 100755 GIT binary patch literal 17408 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 delta 4659 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 Kk7&-~?EeA%_NS}> diff --git a/src/MST_OpenMPI.c b/src/MST_OpenMPI.c index 5ac42e2..41e0911 100644 --- a/src/MST_OpenMPI.c +++ b/src/MST_OpenMPI.c @@ -53,7 +53,7 @@ void PartisiSrc(Edge T[], int i, int j, int *k) { Edge temp = T[p - 1]; T[p - 1] = T[q - 1]; - T[q - 1] = Edge; + T[q - 1] = temp; p++; q--; } @@ -283,7 +283,8 @@ void KruskalMST(Graph *graph, Edge result[], int *e) // Step 1: Sort all the edges into correspondent sorted edges // qsort(graph->edge, graph->E, sizeof(graph->edge[0]), compare); - bubbleSort(graph->edge, graph->E, 1); + // bubbleSort(graph->edge, graph->E, 1); + QuickSortWeight(graph->edge, 0, graph->E); // Step 2: Allocate memory for creating V subsets Subset *subsets = CreateSubset(V); @@ -291,7 +292,6 @@ void KruskalMST(Graph *graph, Edge result[], int *e) { // Pick the smallest edge of the graph Edge next_edge = graph->edge[i++]; - MPI_Send(&x, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); int x = find(subsets, next_edge.src); int y = find(subsets, next_edge.dest); if (x != y) @@ -301,7 +301,7 @@ void KruskalMST(Graph *graph, Edge result[], int *e) } } - bubbleSort(result, (*e), 2); + QuickSortSrc(graph->edge, 0, graph->E); return; // qsort(result, e, sizeof(result[0]), compare_src); } @@ -320,7 +320,7 @@ void printResult(Edge *result, int e) printf("%d\n", minimumCost); - for (int i = start; i < numPartition; i++) + for (int i = 0; i < e; i++) { printf("%d-%d\n", result[i].src, result[i].dest); } diff --git a/src/MST_Serial.c b/src/MST_Serial.c index 6f4a643..4f41d83 100644 --- a/src/MST_Serial.c +++ b/src/MST_Serial.c @@ -43,6 +43,96 @@ void PrintGraph(Graph *graph) printf("%d -- %d = %d\n", graph->edge[i].src, graph->edge[i].dest, graph->edge[i].weight); } } +void PartisiSrc(Edge T[], int i, int j, int *k) +{ + Edge pivot = T[i - 1]; + int p = i; + int q = j; + while (p <= q) + { + while (T[p - 1].src < pivot.src) + { + p++; + } + while (T[q - 1].src > pivot.src) + { + q--; + } + if (p < q) + { + Edge temp = T[p - 1]; + T[p - 1] = T[q - 1]; + T[q - 1] = temp; + p++; + q--; + } + else if (p == q) + { + p++; + } + } + *k = q; +} + +// Mengurutkan array dengan menggunakan Quick Sort +void QuickSortSrc(Edge T[], int i, int j) +{ + int k; + if (i < j) + { + PartisiSrc(T, i, j, &k); + // PrintArray(T, i, k); + // PrintArray(T, k + 1, j); + QuickSortSrc(T, i, k); + QuickSortSrc(T, k + 1, j); + } +} + +void PartisiWeight(Edge T[], int i, int j, int *k) +{ + Edge pivot = T[i - 1]; + int p = i; + int q = j; + while (p <= q) + { + while (T[p - 1].weight < pivot.weight) + { + p++; + } + while (T[q - 1].weight > pivot.weight) + { + q--; + } + if (p < q) + { + Edge temp = T[p - 1]; + T[p - 1] = T[q - 1]; + T[q - 1] = temp; + p++; + q--; + } + else if (p == q) + { + p++; + } + } + *k = q; +} + +// Mengurutkan array dengan menggunakan Quick Sort +void QuickSortWeight(Edge T[], int i, int j) +{ + int k; + if (i < j) + { + PartisiWeight(T, i, j, &k); + // PrintArray(T, i, k); + // PrintArray(T, k + 1, j); + QuickSortWeight(T, i, k); + QuickSortWeight(T, k + 1, j); + } +} + void bubbleSort(Edge arr[], int n, int type) { //Jika type ==1, maka diurutkan berdasarkan weight diff --git a/src/hello b/src/hello deleted file mode 100755 index 1de23036653bc3c34fc555ce1c6d1e0e66f45edb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8600 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 JQBkM;zX8%^JNN(q -- GitLab