Advertisement
Guest User

Untitled

a guest
Mar 24th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.41 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <pthread.h>
  5.  
  6. typedef struct {
  7.     int* res;
  8.     const int* arr1;
  9.     int n;
  10.     const int* arr2;
  11.     int m;
  12. } pack_t;
  13.  
  14. int* create_arr(int n);
  15. void print_arr(const char* name, const int* arr, int n);
  16. void merge_arr(int* res, const int* arr1, int n, const int* arr2, int m);
  17. void delete_arr(int* arr);
  18. void* merge_impl(void* data);
  19. int comp(const void* l, const void* r);
  20.  
  21. const int SIZE_ARR1 = 10;
  22. const int SIZE_ARR2 = 15;
  23. const int MAX_VAL = 100;
  24.  
  25. int main() {
  26.     srand(time(NULL));
  27.     int* arr1 = create_arr(SIZE_ARR1);
  28.     int* arr2 = create_arr(SIZE_ARR2);
  29.     int* res = create_arr(SIZE_ARR1 + SIZE_ARR2);
  30.     qsort(arr1, SIZE_ARR1, sizeof(int), comp);
  31.     qsort(arr2, SIZE_ARR2, sizeof(int), comp);
  32.     print_arr("arr1", arr1, SIZE_ARR1);
  33.     print_arr("arr2", arr2, SIZE_ARR2);
  34.     merge_arr(res, arr1, SIZE_ARR1, arr2, SIZE_ARR2);
  35.     print_arr("res", res, SIZE_ARR1 + SIZE_ARR2);
  36.     delete_arr(arr1);
  37.     delete_arr(arr2);
  38.     delete_arr(res);
  39.     return 0;
  40. }
  41.  
  42. int* create_arr(int n) {
  43.     int* res = (int*) malloc(n * sizeof(int));
  44.     int full = 2 * MAX_VAL + 1;
  45.     for (int i = 0; i < n; ++i) {
  46.         res[i] = rand() % full - MAX_VAL;
  47.     }
  48.     return res;
  49. }
  50.  
  51. void print_arr(const char* name, const int* arr, int n) {
  52.     printf("%s:\n", name);
  53.     for (int i = 0; i < n; ++i) {
  54.         printf("%d ", arr[i]);
  55.     }
  56.     printf("\n\n");
  57. }
  58.  
  59. void merge_arr(int* res, const int* arr1, int n, const int* arr2, int m) {
  60.     int h1 = n / 2, h2 = m / 2;
  61.     pack_t data1 = { res, arr1, h1, arr2, h2 };
  62.     pack_t data2 = { res + h1 + h2, arr1 + h1, n - h1, arr2 + h2, m - h2 };
  63.     pthread_t thread1, thread2;
  64.     pthread_create(&thread1, NULL, merge_impl, &data1);
  65.     pthread_create(&thread2, NULL, merge_impl, &data2);
  66.     pthread_join(thread1, NULL);
  67.     pthread_join(thread2, NULL);
  68. }
  69.  
  70. void delete_arr(int* arr) {
  71.     free(arr);
  72. }
  73.  
  74. void* merge_impl(void* data) {
  75.     pack_t* d = (pack_t*) data;
  76.     int i = 0, j = 0;
  77.     int len = d->n + d->m;
  78.     for (int k = 0; k < len; ++k) {
  79.         if (i < d->n && j < d->m) {
  80.             d->res[k] = d->arr1[i] < d->arr2[j] ? d->arr1[i++] : d->arr2[j++];
  81.         } else {
  82.             d->res[k] = i < d->n ? d->arr1[i++] : d->arr2[j++];
  83.         }
  84.     }
  85.     pthread_exit(NULL);
  86. }
  87.  
  88. int comp(const void* l, const void* r) {
  89.     return *(int*)l - *(int*)r;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement