Advertisement
Guest User

Clean MergeSort attempt 3

a guest
Jan 19th, 2014
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.33 KB | None | 0 0
  1. ///////////////////////////////////////////////////////////////////////////////////////// CLASS
  2. public class MergeSort
  3. {
  4.     private int[] toSort;
  5.        
  6.     public MergeSort(int[] toSort)
  7.     {
  8.         this.toSort = toSort;
  9.     }
  10.    
  11.     public int[] Sort()
  12.     {
  13.         int[] sorted = new int[toSort.Length];
  14.         int[] tmp = new int[toSort.Length];
  15.        
  16.         new MergeSortInternal(new SubArray(toSort), new SubArray(sorted), new SubArray(tmp)).Sort();       
  17.        
  18.         return sorted;
  19.     }
  20. }
  21.  
  22. ///////////////////////////////////////////////////////////////////////////////////////// CLASS
  23. class SubArray
  24. {
  25.     private int leftIndex, rightIndex;
  26.     public readonly int[] array;
  27.    
  28.     public int Length { get { return rightIndex - leftIndex + 1; } }
  29.     public bool IsEmpty { get { return leftIndex > rightIndex} }
  30.     public int FrontElement { get { return array[leftIndex]; } }
  31.    
  32.     public int this[int i]
  33.     {
  34.         get { return array[leftIndex + i]; }
  35.         set { array[leftIndex + i] = value; }
  36.     }
  37.    
  38.     public SubArray(int[] array)
  39.         : this(array, 0, array.Length)
  40.     { }
  41.    
  42.     public SubArray(int[] array, int leftIndex, int rightIndex)
  43.     {
  44.         this.array = array;
  45.         this.leftIndex = leftIndex;
  46.         this.rightIndex = rightIndex;
  47.     }
  48.    
  49.     public Tuple<SubArray, SubArray> SplitInTheMiddle()
  50.     {
  51.         int middle = (leftIndex + rightIndex) / 2;
  52.         int leftSideEnd = middle;
  53.         int rightSideStart = middle + 1;   
  54.    
  55.         SubArray leftSide = new SubArray(array, leftIndex, leftSideEnd);
  56.         SubArray rightSide = new SubArray(array, rightSideStart, rightIndex);
  57.        
  58.         return new Tuple<SubArray,SubArray>(leftSide, rightSide);
  59.     }
  60.    
  61.     public int TakeFrontElement()
  62.     {
  63.         int result = array[leftIndex];
  64.         leftIndex++;
  65.         return result;
  66.     }
  67. }
  68.  
  69. ///////////////////////////////////////////////////////////////////////////////////////// CLASS
  70. class MergeSortInternal
  71. {
  72.     private SubArray toSort;
  73.     private SubArray sorted;
  74.     private SubArray tmp;
  75.  
  76.    
  77.     public MergeSortInternal(SubArray toSort, SubArray sorted, SubArray tmp)
  78.     {
  79.         this.toSort = toSort;
  80.         this.sorted = sorted;
  81.         this.tmp = tmp;
  82.     }
  83.  
  84.     public void Sort()
  85.     {
  86.         if(toSort.Length == 1)
  87.             SortOneElementList();
  88.         else
  89.         {
  90.             var sortedSubArrays = RecursivelySortBothHalfsOfTheArray();
  91.             MergeSubArrays(sortedSubArrays.Item1, sortedSubArrays.Item2);
  92.         }
  93.     }
  94.    
  95.     private void SortOneElementList()
  96.     {
  97.         sorted[0] = toSort[0];
  98.     }
  99.    
  100.     private Tuple<SubArray, SubArray> RecursivelySortBothHalfsOfTheArray()
  101.     {
  102.         // Split arrays
  103.         Tuple<SubArray,SubArray> splitToSort = toSort.SplitInTheMiddle();
  104.         Tuple<SubArray,SubArray> splitTmp = tmp.SplitInTheMiddle();
  105.         Tuple<SubArray,SubArray> splitSorted = sorted.SplitInTheMiddle();
  106.        
  107.         // Sort both parts of toSort into tmp
  108.         new MergeSortInternal(splitToSort.Item1, splitTmp.Item1, splitSorted.Item1).Sort();
  109.         new MergeSortInternal(splitToSort.Item2, splitTmp.Item2, splitSorted.Item2).Sort();
  110.  
  111.         return new Tuple<SubArray, SubArray>(slitTmp.Item1, splitTmp.Item2);
  112.     }
  113.    
  114.     private void MergeSubArrays(SubArray left, SubArray right)
  115.     {      
  116.         for (int i = 0; i < sorted.Length i++)
  117.         {
  118.             if(left.IsEmpty())
  119.                 sorted[i] = right.TakeFrontElement();
  120.             else if(right.IsEmpty())
  121.                 sorted[i] = left.TakeFrontElement();
  122.             else if(left.FrontElement < right.FrontElement)
  123.                 sorted[i] = left.TakeFrontElement();
  124.             else
  125.                 sorted[i] = right.TakeFrontElement();
  126.         }
  127.        
  128.         return sorted;
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement