/// <summary>
 /// Фаза разделения, разделяем данный на два файла по сортированным фазам длинной step
 /// </summary>
 /// <param name="reader">Источник</param>
 /// <param name="writerOne">Первый получатель</param>
 /// <param name="writerTwo">Второй получатель</param>
 /// <param name="step">Длина сортированной фазы</param>
 private void Devision <TInnerType>(IExternalReader <TInnerType> reader, IExternalWriter <TInnerType> writerOne,
                                    IExternalWriter <TInnerType> writerTwo, long step)
     where TInnerType : class, IComparable
 {
     while (reader.IsNext())
     {
         writerOne.Write(reader.Current);
         for (long i = 1; (i < step) && reader.IsNext(); i++)
         {
             writerOne.Write(reader.Current);
         }
         for (long i = 0; (i < step) && reader.IsNext(); i++)
         {
             writerTwo.Write(reader.Current);
         }
     }
 }
        private void DoPhase <TInnerType>(IExternalReader <TInnerType> readerOne, IExternalReader <TInnerType> readerTwo,
                                          IExternalWriter <TInnerType> writer, long step)
            where TInnerType : class, IComparable
        {
            var stepOne = step;
            var stepTwo = step;

            TInnerType currentFirst  = null;
            TInnerType currentSecond = null;

            while (true)
            {
                currentFirst  = ReadNextStudentInPhase(stepOne, readerOne, currentFirst);
                currentSecond = ReadNextStudentInPhase(stepTwo, readerTwo, currentSecond);

                if (currentFirst == null && currentSecond == null)
                {
                    return;
                }

                if (currentFirst == null && currentSecond != null)
                {
                    FillRest(stepTwo, readerTwo, writer, currentSecond);
                    return;
                }

                if (currentFirst != null && currentSecond == null)
                {
                    FillRest(stepOne, readerOne, writer, currentFirst);
                    return;
                }

                if (currentFirst.CompareTo(currentSecond) > 0)
                {
                    writer.Write(currentSecond);
                    stepTwo--;
                    currentSecond = null;
                }
                else
                {
                    writer.Write(currentFirst);
                    stepOne--;
                    currentFirst = null;
                }
            }
        }
        private void FillRest <TInnerType>(long step, IExternalReader <TInnerType> reader,
                                           IExternalWriter <TInnerType> writer, TInnerType student)
            where TInnerType : class, IComparable
        {
            var localStep    = step;
            var localStudent = student;

            while (localStudent != null)
            {
                writer.Write(localStudent);
                localStep--;
                localStudent = ReadNextStudentInPhase(localStep, reader, null);
            }
        }