Skip to content
Snippets Groups Projects
Commit 2e0db1a8 authored by Vicko Novianto's avatar Vicko Novianto
Browse files

source code completed

parent fb28200d
No related merge requests found
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//global
int** bucket;
int* b_idx;
int** getBucket(int* array, int size, int num_p){
//find min max
int min_idx =0; int min = array[0];
int max_idx =0; int max = array[0];
int i;
for(i=1; i<size; i++){
if(array[i]< min){
min_idx = i;
min= array[i];
}
if(array[i]> max){
max_idx = i;
max= array[i];
}
}
bucket = (int**)malloc(sizeof(int*) * num_p);
b_idx = (int*)malloc(sizeof(int) * num_p);
int bsize[num_p];
for(i=0; i<num_p; i++) {
b_idx[i] =0;
bsize[i] = 0;
}
int range = (int)ceil((double)(max-min) / (double)num_p);
for (i = 0; i < size; i++) {
if (array[i] != max) {
bsize[(array[i]-min)/range]++;
}
else {
bsize[((array[i]-min)/range)-1]++;
}
}
for (i = 0; i < num_p; i++) {
bucket[i] = (int*)malloc(sizeof(int) * bsize[i]);
}
for (i = 0; i < size; i++) {
if (array[i] != max) {
bucket[(array[i]-min)/range][b_idx[(array[i]-min)/range]] = array[i] ;
b_idx[(array[i]-min)/range]++;
}
else {
bucket[((array[i]-min)/range)-1][b_idx[((array[i]-min)/range)-1]] = array[i] ;
b_idx[((array[i]-min)/range)-1]++;
}
}
return bucket;
}
int* insertion(int* array_i, int size){
int c, d, t;
int* array_insert = (int*)malloc(sizeof(int) * size);
int k;
for(k=0; k<size; k++) {
array_insert[k] = array_i[k];
}
for (c = 1 ; c <= size - 1; c++) {
d = c;
while ( d > 0 && array_insert[d] < array_insert[d-1]) {
t = array_insert[d];
array_insert[d] = array_insert[d-1];
array_insert[d-1] = t;
d--;
}
}
return array_insert;
}
int main(int argc, char** argv){
if (argc != 3) {
fprintf(stderr, "Usage: bucket num_elements thread_count\n");
exit(1);
}
int num_elements = atoi(argv[1]);
int thread_count = atoi(argv[2]);
srand(time(NULL));
int i, j;
double starttime, endtime;
//start timer
starttime = omp_get_wtime();
//get ints
int *array = (int*)malloc(sizeof(int) * num_elements);
for (i = 0; i < num_elements; i++) {
array[i] = rand() % 100000;
}
bucket = getBucket(array,num_elements, thread_count);
int ** array_sorted;
int sum = 0;
int * curidx = (int*)malloc(sizeof(int) * thread_count);
for (i = 0; i < thread_count; i++) {
array_sorted = (int**)malloc(sizeof(int*) * thread_count);
if (i > 0)
curidx[i] = sum;
sum += b_idx[i];
}
curidx[0] = 0;
int * result = (int*)malloc(sizeof(int) * num_elements);
#pragma omp parallel for num_threads(thread_count) shared(array_sorted, result) schedule(static, 1)
for (i = 0; i < thread_count; i++) {
array_sorted[i] = (int*)malloc(sizeof(int) * b_idx[i]);
array_sorted[i] = insertion(bucket[i], b_idx[i]);
for (j = 0; j < b_idx[i]; j++) {
result[curidx[i]+j] = array_sorted[i][j];
}
}
for (i = 0; i < num_elements; i++)
printf("%d\n", result[i]);
//int * result = (int*)malloc(sizeof(int) * num_elements);
//int k = 0;
//for (i = 0; i < thread_count; i++) {
//for (j = 0; j < b_idx[i]; j++) {
//result[k++] = array_sorted[i][j];
//printf("%d\n", result[i]);
//}
//}
endtime = omp_get_wtime() - starttime;
printf("time : %lf second\n", endtime);
return 0;
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment