diff --git a/bucketsort.c b/bucketsort.c index c7776ff59f800c20ed0d0bc995f319157a2c1534..3530c991f3945e7355fe15c9419f5f1140c26987 100644 --- a/bucketsort.c +++ b/bucketsort.c @@ -4,22 +4,78 @@ #include <string.h> #include <omp.h> -#ifndef ElmtMaks -#define ElmtMaks 100 -#endif +int *copyArray(int const * oldArray, size_t size); +void sort(int *array,int n); +int getThreadPos(int n); +int nMember; +int nThread; -typedef struct Bucket { - int* content; - int n_elmt; -} Bucket; +int main(int argc, char *argv[]) { + if(argc != 3){ + fprintf(stderr, "Usage: bucketsort (jumlah elemen) (jumlah threads)\n"); + exit(1); + } + int i; + int index = 0; + int* member = (int*) malloc (sizeof (int) * nMember); + int* bucketMember; + int id, num = 0; + int buckStat, done = 0; + /* get input */ + nMember = atoi(argv[1]); + nThread = atoi(argv[2]); + + + //make random number + for(i = 1; i<= nMember; i++){ + member[i] = rand() % nMember; + } + int* membersorted = (int*) malloc (sizeof (int) * nMember); + # pragma omp parallel num_threads(nThread) \ + shared(member,index,membersorted,nMember,num) private(done,bucketMember,id,i,buckStat) + { + bucketMember = (int*) malloc (sizeof(int) * nMember); + id = omp_get_thread_num(); + for (i=0;i<nMember;i++) { + if (getThreadPos(member[i])==id) { + bucketMember[buckStat] = member[i]; + buckStat++; + printf("thread = %d, value = %d \n", id, member[i]); + } + } + sort(bucketMember,buckStat);; + while (!done) { + #pragma omp critical + { + if (index==id) { + for (i=0;i<buckStat;i++) { + membersorted[num]=bucketMember[i]; + num++; + } + index++; + done = 1; + } + } + } + } + /* Print Sorted */ + for (i = 0; i < nMember; i++) { + //printf("Hasil dari bucket ke-%d",i); + printf("%d -> %d \n",i+1, membersorted[i]); + } +} int *copyArray(int const * oldArray, size_t size) { int * newArray = malloc(sizeof(int) * size); memcpy(newArray, oldArray, sizeof(int) * size); return newArray; +} + +int getThreadPos(int n){ + return (n * nThread / nMember); } -int *sort(int *array,int n){ +void sort(int *array,int n){ int d,c,t; for (c = 1 ; c <= n - 1; c++) { d = c; @@ -30,89 +86,5 @@ int *sort(int *array,int n){ d--; } } - return array; } -void printElmt (int *array, int size) { - int i; - for (i = 0; i < size; i++) { - printf("%d\n", array[i]); - } -} - - -int main(int argc, char *argv[]) { - if(argc != 3){ - fprintf(stderr, "Usage: bucketsort N(jumlah elemen) M(jumlah bucket)\n"); - exit(1); - } - - /* get input */ - int N = atoi(argv[1]); - int M = atoi(argv[2]); - - int world_size = 6; - - /* Bucket */ - int *random_numbers = NULL; - Bucket *myBucket = NULL; - int i; - int *randomNumbers = (int *) malloc(sizeof(int) * N); - srand(time(NULL)); - for (i = 0; i < N; i++ ) { - randomNumbers[i] = (rand() % ElmtMaks) + 1; - } - random_numbers = randomNumbers; - myBucket = (Bucket *) malloc(sizeof(Bucket) * M); - int n = (ElmtMaks / M) + 1; - int j,k; - for (i = 0; i < M; i++) { - k = 0; - int *t = (int *) malloc(sizeof(int) * N); - for (j = 0; j < N; j++) { - if (( random_numbers[j] >= i * n ) &&( random_numbers[j] < (i * n) + n )){ - t[k] = random_numbers[j]; - k++; - } - } - myBucket[i].n_elmt = k; - myBucket[i].content = copyArray(t, k); - free(t); - } - - i = 0; - - if(M < world_size) - world_size = M; - - int *sorted_nums[world_size]; - int sorted_size[world_size]; - - int *sorted_zero = sort(myBucket[0].content, myBucket[0].n_elmt); - sorted_nums[0] = copyArray(sorted_zero, myBucket[0].n_elmt); - sorted_size[0] = myBucket[0].n_elmt; - if(M == 1){ - sorted_nums[0] = sort(random_numbers,N); - } else { - int temp[world_size]; - for (i = 1; i < world_size; i++) { - /* - MPI_Send(&myBucket[i].n_elmt, 1, MPI_INT, i, 0, MPI_COMM_WORLD); - MPI_Send(myBucket[i].content, myBucket[i].n_elmt, MPI_INT, i, 1, MPI_COMM_WORLD); - */ - # pragma omp parallel num_threads(M) - temp = copyArray(sort(myBucket[i].content, myBucket[i].n_elmt)); - - sorted_nums[i] = copyArray(temp, world_size); - sorted_size[i] = world_size; - } - } - - - /* Print Sorted */ - for (i = 0; i < world_size; i++) { - //printf("Hasil dari bucket ke-%d",i); - printElmt(sorted_nums[i], sorted_size[i]); - } - -}