Advertisement
Guest User

peca

a guest
May 21st, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include "MergeP.h"
  2.  
  3.  
  4.  
  5. MergeP::MergeP(const char* inCharArray, size_t leftFirst, size_t leftLast, size_t rightFirst,
  6.     size_t rightLast, char* outCharArray, size_t outIndex) :
  7.     inCharArray(inCharArray),
  8.     leftFirst(leftFirst),
  9.     leftLast(leftLast),
  10.     rightFirst(rightFirst),
  11.     rightLast(rightLast),
  12.     outCharArray(outCharArray),
  13.     outIndex(outIndex)
  14. {
  15. }
  16.  
  17.  
  18. MergeP::~MergeP()
  19. {
  20. }
  21.  
  22. task * MergeP::execute()
  23. {
  24.     size_t dim1 = leftLast - leftFirst + 1;
  25.     size_t dim2 = rightLast - rightFirst + 1;
  26.  
  27.     if (dim1 < dim2)
  28.     {
  29.         swap(leftFirst, rightFirst);
  30.         swap(leftLast, rightLast);
  31.         swap(dim1, dim2);
  32.     }
  33.  
  34.     if (dim1 == 0) return NULL;
  35.     if (dim1 + dim2 <= 8192)
  36.         MergeSerial(leftFirst, leftLast, rightFirst, rightLast, outIndex);
  37.     else
  38.     {
  39.         size_t mid1 = leftFirst + (leftLast - leftFirst) / 2;
  40.         size_t mid2 = BinarySearch(inCharArray[mid1], rightFirst, rightLast);
  41.         size_t mid3 = outIndex + (mid1 - leftFirst) + (mid2 - rightFirst);
  42.         outCharArray[mid3] = inCharArray[mid1];
  43.  
  44.         MergeP* mergeOne = new(task::allocate_child()) MergeP(inCharArray, leftFirst, size_t(mid1 - 1),
  45.             rightFirst, size_t(mid2 - 1), outCharArray, outIndex);
  46.         MergeP* mergeTwo = new(task::allocate_child()) MergeP(inCharArray, size_t(mid1 + 1), leftLast,
  47.             mid2, rightLast, outCharArray, size_t(mid3 + 1));
  48.        
  49.         set_ref_count(3);
  50.         spawn(*mergeOne);
  51.         spawn_and_wait_for_all(*mergeTwo);
  52.     }
  53.     return NULL;
  54. }
  55.  
  56. size_t MergeP::BinarySearch(char x, size_t first, size_t last)
  57. {
  58.     size_t low = first;
  59.     size_t high = max(first, size_t(last + 1));
  60.     while (low < high)
  61.     {
  62.         size_t mid = low + (high - low) / 2;
  63.         if (x <= inCharArray[mid])
  64.             high = mid;
  65.         else
  66.             low = size_t(mid + 1);
  67.     }
  68.  
  69.     return high;
  70. }
  71.  
  72. void MergeP::MergeSerial(size_t leftFirst, size_t leftLast, size_t rightFirst, size_t rightLast, size_t outIndex)
  73. {
  74.     while (leftFirst <= leftLast && rightFirst <= rightLast)
  75.     {
  76.         if (inCharArray[leftFirst] <= inCharArray[rightFirst])
  77.             outCharArray[outIndex++] = inCharArray[leftFirst++];
  78.         else
  79.             outCharArray[outIndex++] = inCharArray[rightFirst++];
  80.     }
  81.     while (leftFirst <= leftLast)
  82.         outCharArray[outIndex++] = inCharArray[leftFirst++];
  83.     while (rightFirst <= rightLast)
  84.         outCharArray[outIndex++] = inCharArray[rightFirst++];
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement