예제 #1
0
        /// <summary> Копирование всей последовательности из текущего файла в другой,
        /// переданный в качестве параметра
        /// </summary>
        /// <param name="other">Последовательность, в которую будет производиться запись
        /// (в связанный с ней файл)</param>
        /// <returns>Возвращает количество скопированных элементов</returns>
        public int CopySequence(NatureSequence other)
        {
            int res = 0;

            while (!EndOfSequence)
            {
                res += Copy(other);
            }
            return(res);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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();
        }