Example #1
0
 /// <summary>
 /// Фаза разделения, разделяем данный на два файла по сортированным фазам длинной step
 /// </summary>
 /// <param name="reader">Источник</param>
 /// <param name="writerOne">Первый получатель</param>
 /// <param name="writerTwo">Второй получатель</param>
 /// <param name="step">Длина сортированной фазы</param>
 private void Devision(StudentXmlReader reader, StudentXmlWriter writerOne, StudentXmlWriter writerTwo, long step)
 {
     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);
         }
     }
 }
Example #2
0
        private void DoPhase(StudentXmlReader readerOne, StudentXmlReader readerTwo, StudentXmlWriter writer, long step)
        {
            var stepOne = step;
            var stepTwo = step;

            Student?currentFirst  = null;
            Student?currentSecond = null;

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

                if (!currentFirst.HasValue && !currentSecond.HasValue)
                {
                    return;
                }

                if (!currentFirst.HasValue && currentSecond.HasValue)
                {
                    FillRest(stepTwo, readerTwo, writer, currentSecond.Value);
                    return;
                }

                if (currentFirst.HasValue && !currentSecond.HasValue)
                {
                    FillRest(stepOne, readerOne, writer, currentFirst.Value);
                    return;
                }

                if (currentFirst.Value.CompareTo(currentSecond.Value) > 0)
                {
                    writer.Write(currentSecond.Value);
                    stepTwo--;
                    currentSecond = null;
                }
                else
                {
                    writer.Write(currentFirst.Value);
                    stepOne--;
                    currentFirst = null;
                }
            }
        }
Example #3
0
        private void FillRest(long step, StudentXmlReader reader, StudentXmlWriter writer, Student student)
        {
            var     localStep    = step;
            Student?localStudent = student;

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