コード例 #1
0
        /// <summary>
        /// Merge two sorted arrays.
        /// </summary>
        private static void merge(Indexable <T> array, int leftStart, int middle, int rightEnd,
                                  CustomComparer <T> comparer)
        {
            var newLength = rightEnd - leftStart + 1;

            var result = new T[newLength];

            int i = leftStart, j = middle + 1, k = 0;

            //iteratively compare and pick min to result
            while (i <= middle && j <= rightEnd)
            {
                if (comparer.Compare(array[i], array[j]) < 0)
                {
                    result[k] = array[i];
                    i++;
                }
                else
                {
                    result[k] = array[j];
                    j++;
                }
                k++;
            }

            //copy left overs
            if (i <= middle)
            {
                for (var l = i; l <= middle; l++)
                {
                    result[k] = array[l];
                    k++;
                }
            }
            else
            {
                for (var l = j; l <= rightEnd; l++)
                {
                    result[k] = array[l];
                    k++;
                }
            }

            k = 0;
            //now write back result
            for (var g = leftStart; g <= rightEnd; g++)
            {
                array[g] = result[k];
                k++;
            }
        }
コード例 #2
0
        internal static void PartitionMerge(Indexable <T> array, int leftIndex, int rightIndex,
                                            CustomComparer <T> comparer)
        {
            if (leftIndex < 0 || rightIndex < 0 || (rightIndex - leftIndex + 1) < 2)
            {
                return;
            }

            var middle = (leftIndex + rightIndex) / 2;

            PartitionMerge(array, leftIndex, middle, comparer);
            PartitionMerge(array, middle + 1, rightIndex, comparer);

            merge(array, leftIndex, middle, rightIndex, comparer);
        }
コード例 #3
0
 /// <summary>
 /// Time complexity: O(nlog(n)).
 /// </summary>
 public static Indexable <T> Sort(Indexable <T> array, SortDirection sortDirection = SortDirection.Ascending)
 {
     PartitionMerge(array, 0, array.Length - 1, new CustomComparer <T>(sortDirection, Comparer <T> .Default));
     return(array);
 }
コード例 #4
0
 public SpanEnumerator(Indexable <T> span)
 {
     this.span = span;
     index     = -1;
 }