/// <summary> Копирование всей последовательности из текущего файла в другой, /// переданный в качестве параметра /// </summary> /// <param name="other">Последовательность, в которую будет производиться запись /// (в связанный с ней файл)</param> /// <returns>Возвращает количество скопированных элементов</returns> public int CopySequence(NatureSequence other) { int res = 0; while (!EndOfSequence) { res += Copy(other); } return(res); }
/// <summary> Копирование информации из текущего файла в другую последовательность, /// переданную в качестве параметра /// </summary> /// <param name="other">Последовательность, в которую будет производиться запись /// Должна быть открыта на запись</param> /// <returns>Возвращает количество скопированных элементов</returns> public int Copy(NatureSequence other) { other._writer.Write(CurrentValue); other.CurrentValue = CurrentValue; EndOfFile = _reader.BaseStream.Position == _reader.BaseStream.Length; int res = 0; if (!EndOfFile) { ++res; CurrentValue = _reader.ReadInt32(); } EndOfSequence = EndOfFile || other.CurrentValue > CurrentValue; return(res); }
/// <summary> Двухпутевое двухфазное естественное сбалансированное слияние /// </summary> public void Sort() { Counter.SetDefault(); _source = new NatureSequence(Filename); _otherOne = new NatureSequence("natSeq1"); _otherTwo = new NatureSequence("natSeq2"); DateTime firstTime = DateTime.Now; do { Counter.Inc(ECounter.OfCyclint, 1); // запоминаем каждую итерацию Distribute(); // стадия распределения по двум файлам Merge(); // стадия слияния } while (Count > 1); // пока количество полученных серий больше одной DateTime secondTime = DateTime.Now; // получаем затраченное время как разность двух показателей: время текущее - время до начала процесса Counter.OfTime = (secondTime - firstTime).TotalMilliseconds; _otherOne.DeleteFile(); _otherTwo.DeleteFile(); }