Advertisement
arkobabi

Untitled

Nov 23rd, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<pthread.h>
  4. int arr[1000002];
  5. typedef struct qsortstruct
  6. {
  7. int left;
  8. int right;
  9.  
  10. }qsortstruct;
  11.  
  12. void * qsorthelper (void * a);
  13.  
  14. print(int i, int j)
  15. {
  16. int k;
  17. for(k = i; k < j; k++)
  18. printf("%d ", arr[k]);
  19. printf("\n");
  20. }
  21.  
  22. void swap(int i, int j)
  23. {
  24. int temp = arr[i];
  25. arr[i] = arr[j];
  26. arr[j] = temp;
  27. return;
  28. }
  29.  
  30. int partition(int start, int end, int pivot)
  31. {
  32. int i, pivotindex = pivot, pivotvalue = arr[pivot];
  33. swap(end, pivot);
  34. int storeindex = start;
  35. for(i = start; i < end; i++)
  36. {
  37. if(arr[i] < pivotvalue)
  38. {
  39. swap(i, storeindex);
  40. storeindex++;
  41. }
  42. }
  43. swap(end, storeindex);
  44. return storeindex;
  45. }
  46.  
  47. //to find the median value for choosing the pivot element
  48. int median(int a, int b, int c)
  49. {
  50. if(arr[a] < arr[b])
  51. {
  52. if(arr[a] >= arr[c])
  53. a;
  54. else if(arr[c] > arr[b])
  55. b;
  56. }
  57.  
  58. else if(arr[a] >= arr[b])
  59. {
  60. if(arr[c] >= arr[a])
  61. return a;
  62. else if(arr[b] >= arr[c])
  63. return b;
  64. }
  65. return c;
  66. }
  67.  
  68. void quicksort(int start, int end)
  69. {
  70. int i, pivot;
  71. if(start >= end)
  72. return;
  73. pivot = median(start, end, start + (end-start)/2);
  74. int index = partition(start, end, pivot);
  75.  
  76. //the structure to pass to the thread entry point(qsorthelper) as void argument
  77. qsortstruct varl;
  78. varl.left = start;
  79. varl.right = index - 1;
  80. pthread_t threads1;
  81.  
  82. //sort left half of pivot in another thread in parallel
  83. pthread_create(&threads1, NULL, qsorthelper, &varl);
  84.  
  85. quicksort(index + 1, end);
  86. //Wait for both to finish
  87. pthread_join(threads1, NULL);
  88. }
  89.  
  90. //function for thread to start another quicksort in parallel
  91. void * qsorthelper (void * a)
  92. {
  93. qsortstruct * init = ((qsortstruct *)a);
  94. int start = init -> left;
  95. int end = init -> right;
  96. quicksort(start,end);
  97. return NULL;
  98. }
  99.  
  100. int main()
  101. {
  102. int n;
  103. //scan size of input elements
  104. scanf("%d", &n);
  105. int i, j;
  106. for(i = 0; i < n; i++)
  107. scanf("%d", &arr[i]);
  108. quicksort(0, n - 1);
  109. print(0,n);
  110.  
  111. return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement