Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

merge

By: a guest on May 14th, 2012  |  syntax: C#  |  size: 1.86 KB  |  views: 54  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1.  public void threaded_merge_sort(int[] getallen, int p, int r, int depthRemaining)
  2. {
  3.         if (p < r)
  4.         {
  5.                 int q = (p + r) / 2;
  6.  
  7.                 if (depthRemaining > 0)
  8.                 {
  9.                     Parallel.Invoke(
  10.                         () => threaded_merge_sort(getallen, p, q, depthRemaining-1)/*,
  11.                         () => threaded_merge_sort(getallen, q + 1, r, depthRemaining-1)*/);
  12.                     threaded_merge_sort(getallen, q + 1, r, 0);
  13.                 }
  14.                 else
  15.                 {
  16.                     threaded_merge_sort(getallen, p, q, 0);
  17.                     threaded_merge_sort(getallen, q+1, r, 0);
  18.                 }
  19.  
  20.                 merge(getallen, p, q, r);
  21.         }
  22. }
  23.  
  24. public void merge(int[] getallen, int p, int q, int r)
  25. {
  26.             int n1 = q - p + 1;
  27.             int n2 = r - q;
  28.             int[] left = new int[n1];
  29.             int[] right = new int[n2];
  30.  
  31.             for (int i = 0; i < n1; i++)
  32.                 left[i] = getallen[p + i];
  33.             for (int i = 0; i < n2; i++)
  34.                 right[i] = getallen[q + 1 + i];
  35.  
  36.             int leftCounter = 0;
  37.             int rightCounter = 0;
  38.  
  39.             for (int k = p; k <= r; k++)
  40.             {
  41.                 if (left.Length > leftCounter && right.Length > rightCounter)
  42.                 {
  43.                     if (left[leftCounter] <= right[rightCounter])
  44.                         getallen[k] = left[leftCounter++];              
  45.                     else
  46.                         getallen[k] = right[rightCounter++];            
  47.                 }
  48.              
  49.                 else if (left.Length > leftCounter)
  50.                     getallen[k] = left[leftCounter++];                
  51.                 else if (right.Length > rightCounter)
  52.                     getallen[k] = right[rightCounter++];              
  53.             }
  54.         }