/// <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); } } }
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; } } }
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); } }