// Parallelized merge sort algorithm. Uses Task infrastructure to spread sort across available resources private static async Task ParallelSort(TDataStructure arrayToSort, int index, int length, TComparer comparer) { if (length < ParallelSortThreshold) { SequentialSort(arrayToSort, index, length, comparer); } else { TDataStructureAccessor accessor = default(TDataStructureAccessor); int halfLen = length / 2; TaskCompletionSource <bool> rightSortComplete = new System.Threading.Tasks.TaskCompletionSource <bool>(); _ = Task.Run(async() => { await ParallelSort(arrayToSort, index + halfLen, length - halfLen, comparer); rightSortComplete.SetResult(true); }); T[] localCopyOfHalfOfArray = new T[halfLen]; accessor.Copy(arrayToSort, index, localCopyOfHalfOfArray, 0, halfLen); await MergeSortCore <T, T[], ArrayAccessor <T>, TComparer, TCompareAsEqualAction> .ParallelSort(localCopyOfHalfOfArray, 0, halfLen, comparer); await rightSortComplete.Task; Merge(localCopyOfHalfOfArray, arrayToSort, index, halfLen, length, comparer); } }
// Parallelized merge sort algorithm. Uses Task infrastructure to spread sort across available resources private static async Task ParallelSort(TDataStructure arrayToSort, int index, int length, TComparer comparer) { if (length < ParallelSortThreshold) { SequentialSort(arrayToSort, index, length, comparer); } else { TDataStructureAccessor accessor = default(TDataStructureAccessor); int halfLen = length / 2; Task rightSortTask = Task.Run(() => ParallelSort(arrayToSort, index + halfLen, length - halfLen, comparer)); T[] localCopyOfHalfOfArray = new T[halfLen]; accessor.Copy(arrayToSort, index, localCopyOfHalfOfArray, 0, halfLen); await MergeSortCore <T, T[], ArrayAccessor <T>, TComparer, TCompareAsEqualAction> .ParallelSort(localCopyOfHalfOfArray, 0, halfLen, comparer); await rightSortTask; Merge(localCopyOfHalfOfArray, arrayToSort, index, halfLen, length, comparer); } }