diff --git a/bucketsort.c b/bucketsort.c index 0cc104aa7055d256b583c9cf9add17b9db3acdb9..6c6ee1100050125ee7e26a50b63ddc40eab6b16f 100644 --- a/bucketsort.c +++ b/bucketsort.c @@ -1,82 +1,137 @@ #include <stdio.h> +#include <mpi.h> +#include <time.h> +#include <stdlib.h> +#include <string.h> -int main() +int main(int e) { - int n, array[1000], c, d, b, t; - int bucket[500000]; - bucket buckets[n]; - printf("Enter number of elements\n"); - scanf("%d", &n); + int b, rank; + int *buckets; int *array; - printf("Enter number of buckets\n"); - scanf("%d", &b); - - printf("Enter %d integers\n", n); + MPI_Comm_size(MPI_COMM_WORLD, &b); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + array = malloc(sizeof(int*) * e); + //Random nilai array + srand(time(NULL)); + for(int i=0; i<e; i++) { + array[i] = rand(); + } + + buckets = bucketSort(array, b); - for (c = 0; c < n; c++) { - scanf("%d", &array[c]); - } - - buckets = bucketSort(array,b); - return 0; + MPI_Finalize(); } -int getSize(int[] array) -{ +int getSize(int *array) { int n = 0; - int i = 0; - while (array[i] != NULL) - { + + while (array[n]) { n++; - i++; } return n; } + int max; + max = array[0]; + + for(int i=1; i<n; i++) { + if(array[i] > max) { + max = array + } + } + + return max; +} -int bucketSort(int[] array, int n) -{ - int bucket[500000]; - bucket buckets[n]; - int k; - int arrsize = getSize(array); - for (int i = 0; i <= n-1; i++) - { +int *bucketSort(int *array, int n) { //n adalah jumlah bucket + int **buckets; //Isi bucket + int k; //rentang nilai isi bucket + int arrsize; //panjang array + int count; //Untuk menentukan nomor cell pada bucket tertentu + + //openMPI Scatterv requirements + int *sendbuf; //bucket yang sudah disortir dan akan di-return + int *sendcounts; + int *displs; + + sendcounts = malloc(sizeof(int*) * n); + displs = malloc(sizeof(int*) * n); + + arrsize = getSize(array); + + count = malloc(sizeof(int *) * n); + buckets = malloc(sizeof(int *) * n); + for(int i=0; i<n; i++) { + count[i] = 0; + buckets[i] = malloc(sizeof(int *) * arrsize); + } + + //Menghitung rentang nilai bucket + if(((max-min+1)%n) > 0) { + k = ((max-min+1)/n) + 1; + } else { + k = ((max-min+1)/n); + } + + //Mengisi array ke bucket yang sesuai + for (int i = 0; i<arrsize; i++) { int m; //nomor bucket - int x; //menghitung mod - m = array[i]/k; - x = array[i]%k; - if(x>0) { - int c; - c = getSize(buckets[m+1]); - buckets[m+1][c+1] = array[i]; - } else { - int c; - c = getSize(buckets[m+1]); - bucket[m][c+1] = array[i]; - } - - } - for (int i = 0; i <= n-1; i++) - { - nextSort(buckets[i]); + + m = array[i]/k; + buckets[m][count[m]] = array[i]; + + count[m]++; } - return buckets; + + for(int i=0; i<n; i++) { + sendcounts[i] = count[i]; + } + + displs[0] = 0; + for(int i=1; i<n; i++) { + displs[i] = displs[i-1] + count[i-1]; + } + + for(int i=0; i<n; i++) { + memcpy(sendbuf + displs[i], buckets[i], count[i]; + free(buckets[i]); + } + free(buckets); + + return sendbuf; + + //Melakukan pengurutan nilai setiap bucket ke openMPI + + MPI_Scatterv(sendbuf, sendcounts, displs, + MPI_int, 8recvbuf, int recvcount, + MPI_Datatype recvtype, 0, MPI_Comm comm); } -void nextSort(int[] array) -{ +int *bucket(int **array, int i, int count) { //i adalah nomor bucket, count adalah jumlah isi bucket + int *tempBucket; + tempBucket = malloc(sizeof(int*) * count); + + for(int j=0; j<count; j++) { + tempBucket[j] = array[i][count]; + } + + return tempBucket; +} + +void nextSort(int *array) { int n = getSize(array); int d, t; - for (int c = 1 ; c <= n - 1; c++) { - d = c; - - while ( d > 0 && array[d] < array[d-1]) { - t = array[d]; - array[d] = array[d-1]; - array[d-1] = t; + for (int i=1 ; i <=n-1; i++) { + d = i; - d--; + while ((d > 0) && (array[d] < array[d-1])) { + t = array[d]; + array[d] = array[d-1]; + array[d-1] = t; + + d--; } } }