summaryrefslogtreecommitdiff
path: root/sort/parallelmerge.go
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2020-08-08 13:01:36 +0100
committerPaul Buetow <pbuetow@mimecast.com>2020-08-08 13:01:36 +0100
commit390333bb314f6cb25adc5716ea383112860ed342 (patch)
tree2b87d5741d84b2cd2d7c74eaaa0f522c3a8a221c /sort/parallelmerge.go
parentdeaa4e1c33cd2c1c75f698881918688055abfa51 (diff)
add parallelquick and so on
Diffstat (limited to 'sort/parallelmerge.go')
-rw-r--r--sort/parallelmerge.go36
1 files changed, 36 insertions, 0 deletions
diff --git a/sort/parallelmerge.go b/sort/parallelmerge.go
new file mode 100644
index 0000000..b6cf721
--- /dev/null
+++ b/sort/parallelmerge.go
@@ -0,0 +1,36 @@
+package sort
+
+import (
+ "algorithms/ds"
+ "sync"
+)
+
+func ParallelMerge(a ds.ArrayList) ds.ArrayList {
+ aux := make(ds.ArrayList, len(a))
+ parallelMerge(a, aux, 0, len(a)-1)
+
+ return a
+}
+
+func parallelMerge(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() {
+ parallelMerge(a, aux, lo, mid)
+ wg.Done()
+ }()
+ go func() {
+ parallelMerge(a, aux, mid+1, hi)
+ wg.Done()
+ }()
+ wg.Wait()
+}