public ISortMethod <T> CreateSortMethod <T>(ChunkStack <T> chunkStack, IChunkStackFactory <T> chunkStackFactory) where T : IComparable { switch (_sortMethod) { case SortMethod.MergeSort: { return(new OppositeMergeSort <T>( chunkStack, chunkStackFactory.CreateChunkStack(), _onlyMemoryMerge)); } case SortMethod.MergeQuickSort: { if (_quickSortSize != null) { return(new OppositeMergeQuickSort <T>( chunkStack, chunkStackFactory.CreateChunkStack(), _quickSortSize.Value, _onlyMemoryMerge)); } return(new OppositeMergeQuickSort <T>( chunkStack, chunkStackFactory.CreateChunkStack(), onlyMemoryMerge: _onlyMemoryMerge)); } case SortMethod.ConcurrentMergeQuickSort: { if (_quickSortSize != null) { return(new ConcurrentOppositeMergeQuickSort <T>( chunkStack, chunkStackFactory, _channelCapacity, _sortConcurrency, _mergeConcurrency, _quickSortSize.Value, _onlyMemoryMerge)); } return(new ConcurrentOppositeMergeQuickSort <T>( chunkStack, chunkStackFactory, _channelCapacity, _sortConcurrency, _mergeConcurrency, onlyMemoryMerge: _onlyMemoryMerge)); } default: throw new NotSupportedException(); } }
public ConcurrentOppositeMergeQuickSort( ChunkStack <T> chunkStack, IChunkStackFactory <T> chunkStackFactory, int channelCapacity = 2, int sortConcurrency = 10, int mergeConcurrency = 4, int chunkSize = 1000000, bool onlyMemoryMerge = false) : base(chunkStack, null, onlyMemoryMerge) { _chunkSize = chunkSize; _chunkStackFactory = chunkStackFactory; _channelCapacity = channelCapacity; _sortConcurrency = sortConcurrency; _mergeConcurrency = mergeConcurrency; _onlyMemoryMerge = onlyMemoryMerge; }