summaryrefslogtreecommitdiff
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
parentae7d31d6b6d735810ea27b788491d291754374aa (diff)
refactor
-rw-r--r--sort/bottomupmerge.go2
-rw-r--r--sort/merge.go6
-rw-r--r--sort/parallelmerge.go29
-rw-r--r--sort/selection.go4
-rw-r--r--sort/sort_test.go4
5 files changed, 25 insertions, 20 deletions
diff --git a/sort/bottomupmerge.go b/sort/bottomupmerge.go
index e7788bb..4891c04 100644
--- a/sort/bottomupmerge.go
+++ b/sort/bottomupmerge.go
@@ -10,7 +10,7 @@ func BottomUpMerge(a ds.ArrayList) ds.ArrayList {
for sz := 1; sz < length; sz = sz + sz {
for lo := 0; lo < length-sz; lo += sz + sz {
- merge(a, aux, lo, lo+sz-1, min(lo+sz+sz-1, length-1))
+ merge(a, aux, lo, lo+sz, min(lo+sz+sz-1, length-1))
}
}
diff --git a/sort/merge.go b/sort/merge.go
index 86eb315..1f48c3a 100644
--- a/sort/merge.go
+++ b/sort/merge.go
@@ -20,7 +20,7 @@ func mergeSort(a, aux ds.ArrayList) {
mi := length / 2
mergeSort(a[0:mi], aux[0:mi])
mergeSort(a[mi:], aux[mi:])
- merge(a, aux, 0, mi-1, length-1)
+ merge(a, aux, 0, mi, length-1)
}
func merge(a, aux ds.ArrayList, lo, mi, hi int) {
@@ -29,11 +29,11 @@ func merge(a, aux ds.ArrayList, lo, mi, hi int) {
}
i := lo
- j := mi + 1
+ j := mi
for k := lo; k <= hi; k++ {
switch {
- case i > mi:
+ case i >= mi:
a[k] = aux[j]
j++
case j > hi:
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
}
diff --git a/sort/selection.go b/sort/selection.go
index 798fa27..781292a 100644
--- a/sort/selection.go
+++ b/sort/selection.go
@@ -17,9 +17,7 @@ func Selection(a ds.ArrayList) ds.ArrayList {
if min == i {
continue
}
- tmp := a[i]
- a[i] = a[min]
- a[min] = tmp
+ a.Swap(i, min)
}
return a
diff --git a/sort/sort_test.go b/sort/sort_test.go
index f350b46..e3bda34 100644
--- a/sort/sort_test.go
+++ b/sort/sort_test.go
@@ -11,8 +11,8 @@ var benchResult ds.ArrayList
var benchResultInt []int
const minLength int = 1
-const maxLength int = 1000
-const maxSlowLength int = 1000
+const maxLength int = 10000
+const maxSlowLength int = 10000
var arrayListCache map[string]ds.ArrayList