diff options
| author | Paul Buetow <pbuetow@mimecast.com> | 2020-08-08 15:57:37 +0100 |
|---|---|---|
| committer | Paul Buetow <pbuetow@mimecast.com> | 2020-08-08 15:57:37 +0100 |
| commit | b8c45f87d6f7251701f95eb6b8ac1efd4255d298 (patch) | |
| tree | 6076a23ec57d75c57bd2a5556afbf9c94a32d23f /sort | |
| parent | ae7d31d6b6d735810ea27b788491d291754374aa (diff) | |
refactor
Diffstat (limited to 'sort')
| -rw-r--r-- | sort/bottomupmerge.go | 2 | ||||
| -rw-r--r-- | sort/merge.go | 6 | ||||
| -rw-r--r-- | sort/parallelmerge.go | 29 | ||||
| -rw-r--r-- | sort/selection.go | 4 | ||||
| -rw-r--r-- | sort/sort_test.go | 4 |
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 |
