Skip to content
Snippets Groups Projects
Commit 91338c36 authored by 13513079's avatar 13513079
Browse files

Bucket sort (omp) done

parent fb28200d
No related merge requests found
File added
//Nama File : bucket_sort_omp.c
//Oleh : Jessica Handayani 13513069 & Asanilta Fahda 13513079
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
int* create_rand_nums(int num_elements) {
int *rand_nums = (int *)malloc(sizeof(int) * num_elements);
assert(rand_nums != NULL);
int i;
for (i = 0; i < num_elements; i++) {
rand_nums[i] = (rand() % (int)num_elements);
}
return rand_nums;
}
int** create_bucket_arrays(int num_buckets, int num_elements) {
int i;
int** bucket_arrays = (int**)malloc(sizeof(int*) * num_buckets);
for (i = 0; i < num_buckets; i++) {
bucket_arrays[i] = (int *)malloc(sizeof(int) * num_elements);
}
return bucket_arrays;
}
int* insertion_sort(int* elements, int num_elements){
int i,j;
int temp;
for(i = 0; i < num_elements; i++){
j = i;
while (j > 0 && elements[j] < elements[j-1]) {
temp = elements[j];
elements[j] = elements[j-1];
elements[j-1] = temp;
j--;
}
}
return elements;
}
int main(int argc, char* argv[]) {
if (argc != 2){
fprintf(stderr, "Usage: num_elements\n");
exit(1);
}
double time = 0.0;
int thread_count = strtol(argv[1], NULL, 10);
int N;
printf("Enter N\n");
scanf("%d", &N);
int i;
int j;
//create array of N random numbers
int* rand_nums = create_rand_nums(N);
int** bucket_arrays = create_bucket_arrays(thread_count,N);
int* last_index = (int *)malloc(sizeof(int) * thread_count);
for (i = 0; i < thread_count; i ++) {
last_index[i] = 0;
}
int bucket_range = (N%thread_count == 0) ? N/thread_count : N/thread_count+1;
time -= omp_get_wtime();
int bucket;
//insert numbers to appropriate bucket arrays
for (i = 0; i < N; i++) {
bucket = rand_nums[i]/bucket_range;
bucket_arrays[bucket][last_index[bucket]++] = rand_nums[i];
}
//sort arrays in parallel
# pragma omp parallel for num_threads(thread_count)
for (i = 0; i < thread_count; i++) {
bucket_arrays[i] = insertion_sort(bucket_arrays[i],last_index[i]);
}
//combine sorted arrays
int* sorted_array = (int *)malloc(sizeof(int) * N);
int last_sorted_index = 0;
for (i = 0; i < thread_count; i++) {
for (j = 0; j < last_index[i]; j++) {
sorted_array[last_sorted_index++] = bucket_arrays[i][j];
}
}
time += omp_get_wtime();
printf("Sorted: ");
for (i = 0; i < N; i++) {
printf("%d ",sorted_array[i]);
}
printf("\nTime : %lf s\n", time);
}
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