summaryrefslogtreecommitdiff
path: root/sort/merge2.go
diff options
context:
space:
mode:
Diffstat (limited to 'sort/merge2.go')
-rw-r--r--sort/merge2.go37
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()
+}