diff options
Diffstat (limited to 'sort/merge2.go')
| -rw-r--r-- | sort/merge2.go | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/sort/merge2.go b/sort/merge2.go new file mode 100644 index 0000000..774c3c5 --- /dev/null +++ b/sort/merge2.go @@ -0,0 +1,37 @@ +package sort + +import ( + "algorithms/ds" + "sync" +) + +// Merge2 is a parallelized version of Merge +func Merge2(a ds.ArrayList) ds.ArrayList { + aux := make(ds.ArrayList, len(a)) + mergeSort2(a, aux, 0, len(a)-1) + + return a +} + +func mergeSort2(a, aux ds.ArrayList, lo, hi int) { + mid := lo + (hi-lo)/2 + defer merge(a, aux, lo, mid, hi) + + if hi-lo <= 1000 { + mergeSort(a, aux, lo, mid) + mergeSort(a, aux, mid+1, hi) + return + } + + var wg sync.WaitGroup + wg.Add(2) + go func() { + mergeSort2(a, aux, lo, mid) + wg.Done() + }() + go func() { + mergeSort2(a, aux, mid+1, hi) + wg.Done() + }() + wg.Wait() +} |
