summaryrefslogtreecommitdiff
path: root/sort/parallelmerge.go
diff options
context:
space:
mode:
authorPaul Buetow <pbuetow@mimecast.com>2020-08-08 15:57:37 +0100
committerPaul Buetow <pbuetow@mimecast.com>2020-08-08 15:57:37 +0100
commitb8c45f87d6f7251701f95eb6b8ac1efd4255d298 (patch)
tree6076a23ec57d75c57bd2a5556afbf9c94a32d23f /sort/parallelmerge.go
parentae7d31d6b6d735810ea27b788491d291754374aa (diff)
refactor
Diffstat (limited to 'sort/parallelmerge.go')
-rw-r--r--sort/parallelmerge.go29
1 files changed, 18 insertions, 11 deletions
diff --git a/sort/parallelmerge.go b/sort/parallelmerge.go
index 577d7c1..f9a59a3 100644
--- a/sort/parallelmerge.go
+++ b/sort/parallelmerge.go
@@ -6,31 +6,38 @@ import (
)
func ParallelMerge(a ds.ArrayList) ds.ArrayList {
- aux := make(ds.ArrayList, len(a))
- parallelMerge(a, aux, 0, len(a)-1)
-
+ parallelMerge(a, make(ds.ArrayList, len(a)))
return a
}
-func parallelMerge(a, aux ds.ArrayList, lo, hi int) {
- mid := lo + (hi-lo)/2
- defer merge(a, aux, lo, mid, hi)
+func parallelMerge(a, aux ds.ArrayList) {
+ length := len(a)
+ if length <= 1 {
+ return
+ }
- if hi-lo <= 1000 {
- //mergeSort(a, aux, lo, mid)
- //mergeSort(a, aux, mid+1, hi)
+ mi := length / 2
+ if length < 1000 {
+ mergeSort(a[0:mi], aux[0:mi])
+ mergeSort(a[mi:], aux[mi:])
+ merge(a, aux, 0, mi, length-1)
return
}
var wg sync.WaitGroup
wg.Add(2)
+
go func() {
- parallelMerge(a, aux, lo, mid)
+ parallelMerge(a[0:mi], aux[0:mi])
wg.Done()
}()
+
go func() {
- parallelMerge(a, aux, mid+1, hi)
+ parallelMerge(a[mi:], aux[mi:])
wg.Done()
}()
+
wg.Wait()
+ merge(a, aux, 0, mi, length-1)
+ return
}