diff --git a/sort.cpp b/sort.cpp new file mode 100644 index 0000000000000000000000000000000000000000..95e90c0b6b8fc696954fcc52ac424796877921bf --- /dev/null +++ b/sort.cpp @@ -0,0 +1,69 @@ +#include <cstdio> +#include <cstdlib> +#include <ctime> +#include <omp.h> +#include <vector> + +using namespace std; + +int n, m[400100]; +int thread_count; +vector<int> sub[600]; + +void bucketSort(void) { + int my_rank = omp_get_thread_num(); + int size = sub[my_rank].size(); + + for (int i = 0; i < size; i++) { + for (int j = i+1; j < size; j++) { + if (sub[my_rank][i] > sub[my_rank][j]) { + int tmp = sub[my_rank][i]; + sub[my_rank][i] = sub[my_rank][j]; + sub[my_rank][j] = tmp; + } + } + } +} + +int getSection(int x) { + int width = n / thread_count; + if (x) { + x--; + } + + return x/width; +} + +int main(int argc, char *argv[]) { + thread_count = strtol(argv[1], NULL, 10); + + scanf("%d", &n); + for (int i = 0; i < n; i++) { + m[i] = rand() % n; + } + + time_t startTime, endTime; + time(&startTime); + for (int i = 0; i < n; i++) { + sub[getSection(m[i])].push_back(m[i]); + } + + #pragma omp parallel num_threads(thread_count) + bucketSort(); + #pragma omp barrier + + vector<int> result; + for (int i = 0; i < thread_count; i++) { + int size = sub[i].size(); + for (int j = 0; j < size; j++) { + result.push_back(sub[i][j]); + } + } + + time(&endTime); + double diff = difftime(endTime, startTime); + printf("%lf\n", diff); + printf("\n"); + + return 0; +}