Example #1
0
        private GroupedItem <T>[] MergeBlocks(
            IFileWriter fileWriter,
            int blockSize,
            GroupedItem <T>[] left,
            GroupedItem <T>[] right
            )
        {
            _Status = SortStatus.Merging;

            if (left.Length == 0)
            {
                return(right);
            }

            if (right.Length == 0)
            {
                return(left);
            }

            if (
                _comparer.Compare(left[0], left[left.Length - 1]) == 0 &&
                _comparer.Compare(right[0], right[right.Length - 1]) == 0
                )
            {
                if (_comparer.Compare(left[left.Length - 1], right[0]) <= 0)
                {
                    Write(fileWriter, right);

                    _BlocksMerged += 2;

                    return(left);
                }

                Write(fileWriter, left);

                _BlocksMerged += 2;

                return(right);
            }

            left = _sortStrategy.Merge(left, right);

            _BlocksMerged += 2;

            Write(fileWriter, left.Skip(blockSize).ToArray());

            return(left.Take(blockSize).ToArray());
        }