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