public void Sort() { DataBlockDescriptor[] blockDescriptors = BuildInputBlockDescriptors(); Array.ForEach(blockDescriptors, x => { DataBlock dataBlock = ReadInputBlock(x); dataBlock.Sort(Sorter, Comparison); WriteToTemporaryFile(dataBlock); }); OutputQueue[] outputQueues = BuildOutputQueues(); FillOutputQueues(outputQueues, blockDescriptors); MergePriorityQueue mergeQueue = new MergePriorityQueue(); FillPriorityQueue(mergeQueue, outputQueues); OutputQueue outputQueue = BuildOutputQueue(); while (!mergeQueue.IsEmpty) { MergePriorityQueueValue minValue = mergeQueue.DeleteMinimumValue(); outputQueue.EnQueue(minValue.Value); if (outputQueue.IsFull) { FlushOutputQueue(outputQueue); } OutputQueue queue = outputQueues[minValue.BlockID]; if (queue.IsEmpty) { FillOutputQueue(queue, blockDescriptors[minValue.BlockID]); } if (!queue.IsEmpty) { T value = queue.DeQueue(); mergeQueue.Insert(new MergePriorityQueueKey(this.comparison, value), new MergePriorityQueueValue(value, minValue.BlockID)); } if (mergeQueue.IsEmpty) { FillPriorityQueue(mergeQueue, outputQueues); } } FlushOutputQueue(outputQueue); }