Example #1
0
        static MergeObj TopDownSplitMerge(uint[] B, int iBegin, int iEnd, uint[] A)
        {
            MergeObj mergeBox = new MergeObj();

            if (iEnd - iBegin <= 1)
            {
                mergeBox = CopyToMergeObjA(mergeBox, A);
                mergeBox = CopyToMergeObjB(mergeBox, B);
                return(mergeBox);
            }                                                     // if run size == 1
                                                                  // consider it sorted
                                                                  // split the run longer than 1 item into halves
            int iMiddle = (iEnd + iBegin) / 2;                    // iMiddle = mid point

            // recursively sort both runs from array A[] into B[]
            mergeBox = TopDownSplitMerge(A, iBegin, iMiddle, B);  // sort the left  run
            A        = mergeBox.A;
            B        = mergeBox.B;
            mergeBox = TopDownSplitMerge(A, iMiddle, iEnd, B);    // sort the right run
                                                                  // merge the resulting runs from array B[] into A[]
            A        = mergeBox.A;
            B        = mergeBox.B;
            mergeBox = TopDownMerge(B, iBegin, iMiddle, iEnd, A);
            return(mergeBox);
        }
Example #2
0
 static MergeObj CopyToMergeObjB(MergeObj mergeBox, uint[] B)
 {
     for (int i = 0; i < 256; i++)
     {
         mergeBox.B[i] = B[i];
     }
     return(mergeBox);
 }
Example #3
0
 static MergeObj CopyToMergeObjA(MergeObj mergeBox, uint[] A)
 {
     for (int i = 0; i < 256; i++)
     {
         mergeBox.A[i] = A[i];
     }
     return(mergeBox);
 }
Example #4
0
        public uint[] MergeSort(uint[] A, uint[] B, int n)
        {
            MergeObj mergeBox = new MergeObj();

            mergeBox = CopyToMergeObjA(mergeBox, A);
            mergeBox = TopDownMergeSort(A, B, n);
            B        = mergeBox.B;
            return(B);
        }
Example #5
0
        static MergeObj CopyArray(uint[] A, int iBegin, int iEnd, uint[] B)
        {
            MergeObj mergeBox = new MergeObj();

            for (int k = iBegin; k < iEnd; k++)
            {
                B[k] = A[k];
            }

            mergeBox = CopyToMergeObjA(mergeBox, A);
            mergeBox = CopyToMergeObjB(mergeBox, B);
            return(mergeBox);
        }
Example #6
0
        static MergeObj TopDownMergeSort(uint[] A, uint[] B, int n)
        {
            n = 0;
            MergeObj mergeBox = new MergeObj();

            for (int i = 0; i < 256; i++)
            {
                if (A[i] != 0)
                {
                    n++;
                }
            }
            mergeBox = CopyArray(A, 0, n, B);                       // one time copy of A[] to B[]
            A        = mergeBox.A;
            B        = mergeBox.B;
            mergeBox = TopDownSplitMerge(B, 0, n, A);               // sort data from B[] into A[]
            return(mergeBox);
        }
Example #7
0
        static MergeObj TopDownMerge(uint[] A, int iBegin, int iMiddle, int iEnd, uint[] B)
        {
            int      i = iBegin, j = iMiddle;
            MergeObj mergeBox = new MergeObj();

            // While there are elements in the left or right runs...
            for (int k = iBegin; k < iEnd; k++)
            {
                // If left run head exists and is <= existing right run head.
                if (i < iMiddle && (j >= iEnd || A[i] <= A[j]))
                {
                    B[k] = A[i];
                    i    = i + 1;
                }
                else
                {
                    B[k] = A[j];
                    j    = j + 1;
                }
            }
            mergeBox = CopyToMergeObjA(mergeBox, A);
            mergeBox = CopyToMergeObjB(mergeBox, B);
            return(mergeBox);
        }