Ejemplo n.º 1
0
        public virtual void Sort()
        {
            SaveCurrent();
            if (!SortOnSave)
            {
                for (int i = 0; i < bucketsCount; i++)
                {
                    Sort(i);
                }
            }
            var enumerators = new IEnumerator <T> [bucketsCount];

            for (int i = 0; i < bucketsCount; i++)
            {
                enumerators[i] = new SmallPartEnumerator(PathToDirectory + SORTED + i, BytesGetter);
            }
#if false
            T[]    curMinimums = new T[bucketsCount];
            bool[] finished    = new bool[bucketsCount];

            for (int i = 0; i < curMinimums.Length; i++)
            {
                enumerators[i].MoveNext();
                curMinimums[i] = enumerators[i].Current;
            }
            Clear();

            int argMin;
            do
            {
                argMin = -1;
                for (int i = 0; i < curMinimums.Length; i++)
                {
                    if (!finished[i] && (argMin == -1 || curMinimums[i].CompareTo(curMinimums[argMin]) < 0))
                    {
                        argMin = i;
                    }
                }
                if (argMin >= 0)
                {
                    Add(curMinimums[argMin]);
                    if (enumerators[argMin].MoveNext())
                    {
                        curMinimums[argMin] = enumerators[argMin].Current;
                    }
                    else
                    {
                        finished[argMin] = true;
                    }
                }
            } while (argMin >= 0);
#else
            Clear();
            Merge(enumerators);
#endif
        }
Ejemplo n.º 2
0
        public override void Sort()
        {
            SaveCurrent();
            if (!SortOnSave)
            {
                for (int i = 0; i < bucketsCount; i++)
                {
                    Sort(i);
                }
            }
            queue = new Queue <int>();
            for (int i = 0; i < bucketsCount; i++)
            {
                queue.Enqueue(i);
            }
            var curIndx = bucketsCount;

            merging = true;
            while (queue.Count > 0)
            {
                var size = Math.Min(k, queue.Count);
                IEnumerator <T>[] enumerators = new IEnumerator <T> [size];
                for (int i = 0; i < size; i++)
                {
                    enumerators[i] = new SmallPartEnumerator(PathToDirectory + SORTED + queue.Dequeue(), BytesGetter, buffer);
                }
                Clear();
                if (queue.Count == 0)
                {
                    merging    = false;
                    preamble   = EXTERNAL;
                    SortOnSave = false;
                    Merge(enumerators);
                    SortOnSave = true;
                }
                else
                {
                    currentStream = new BufferedStream(new FileStream(PathToDirectory + SORTED + curIndx,
                                                                      FileMode.Create,
                                                                      FileAccess.Write, FileShare.None));
                    index = 0;
                    Merge(enumerators);
                    queue.Enqueue(curIndx++);
                    Buffer.BlockCopy(current, 0, bytes, 0, index * bytesRequired);
                    currentStream.Write(bytes, 0, index * bytesRequired);
                    currentStream.Close();
                }
            }
            merging = false;
        }