pastebin

Paste Search Dynamic
Recent pastes
mergesort pthread
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<pthread.h>
  4.  
  5. #define MAX 1000
  6. void *mergesort_pthread(void *);
  7. void merge(int,int);
  8. int arr[MAX];
  9.  
  10. struct ArrayIndex
  11. {
  12.  int low;
  13.  int high;
  14.  
  15. };
  16. int main()
  17. {
  18.  
  19.  struct ArrayIndex ai;
  20.  ai.low = 0;
  21.  ai.high =  MAX - 1;
  22.  pthread_t t;
  23.  
  24.  // Generating Random Values...
  25.  
  26.  printf("Unsorted Datan");
  27.  srand(time(null));
  28.  int i;
  29.  for(i=0;i<MAX;i++)
  30.  {
  31.    arr[i] = rand() % MAX;
  32.    printf("%d ",arr[i]);
  33.  
  34.  }
  35.  
  36.  int retval;
  37.  clock_t t1,t2;
  38.  t1 = clock();
  39.  
  40.   retval = pthread_create(&t,null,mergesort_pthread,&ai);
  41.   if(retval)
  42.   {  
  43.           printf("Thread Creation Failed...!! Return value is %dn",retval);
  44.           return 0;
  45.  
  46.   }
  47.   pthread_join(t,null);
  48.  t2 = clock();
  49.  double t3 = (double)(t2 - t1)/clocks_per_sec;
  50.  printf("nSorted Datan");
  51.  
  52.  for(i=0;i<MAX;i++)
  53.  {
  54.    printf("%d ",arr[i]);
  55.  }
  56.  
  57.  printf("nTime Elapsed: %.5fn",t3);
  58.  
  59.  return 0;
  60.  
  61. }
  62. void* mergesort_pthread(void* ptr)
  63. {
  64.    struct ArrayIndex *p = (struct ArrayIndex *)ptr;
  65.    struct ArrayIndex a1,a2;
  66.  
  67.    int mid = (p->low + p->high)/2;
  68.  
  69.    pthread_t t1,t2;
  70.    int retval;
  71.  
  72.    a1.low = p->low;
  73.    a1.high = mid;
  74.  
  75.    a2.low = mid + 1;
  76.    a2.high = p->high;  
  77.  
  78.   if(p->low >= p->high)
  79.   {
  80.     return 0;
  81.   }
  82.    
  83.    retval = pthread_create(&t1,null,mergesort_pthread,&a1);
  84.    if(retval)
  85.    {  
  86.           printf("Thread Creation Failed...!! Return value is %dn",retval);
  87.           return 0;
  88.  
  89.    }
  90.  
  91.    retval = pthread_create(&t2,null,mergesort_pthread,&a2);
  92.    if(retval)
  93.    {  
  94.           printf("Thread Creation Failed...!! Return value is %dn",retval);
  95.           return 0;
  96.  
  97.    }   
  98.  
  99.   pthread_join(t1,null);
  100.   pthread_join(t2,null);
  101.  
  102.   merge(p->low,p->high);
  103.   return 0;
  104. }
  105. void merge(int low,int high)
  106. {
  107.  
  108.   int mid = (low + high)/2;
  109.   int *left = (int *)malloc(sizeof(int)*(mid - low + 1));
  110.   int *right = (int *)malloc(sizeof(int)*(high - mid));
  111.  
  112.   int n1 = mid - low + 1, n2 = high - mid, i, j;
  113.  
  114.     for (i = 0; i < n1; i++)
  115.         left[i] = arr[i + low];
  116.  
  117.     for (i = 0; i < n2; i++)
  118.         right[i] = arr[i + mid + 1];
  119.  
  120.     int k = low;
  121.     i = j = 0;
  122.  
  123.     while (i < n1 && j < n2) {
  124.         if (left[i] <= right[j])
  125.             arr[k++] = left[i++];
  126.         else
  127.             arr[k++] = right[j++];
  128.     }
  129.  
  130.     while (i < n1) {
  131.         arr[k++] = left[i++];
  132.     }
  133.  
  134.     while (j < n2) {
  135.         arr[k++] = right[j++];
  136.     }
  137.  
  138. }
Parsed in 0.052 seconds