示例#1
0
 internal virtual void FillPriorityQueue(MergePriorityQueue queue, OutputQueue[] outputQueues)
 {
     for (int n = 0; n < outputQueues.Length; n++)
     {
         if (!outputQueues[n].IsEmpty)
         {
             T value = outputQueues[n].DeQueue();
             queue.Insert(new MergePriorityQueueKey(Comparison, value), new MergePriorityQueueValue(value, n));
         }
     }
 }
示例#2
0
        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);
        }