summaryrefslogtreecommitdiff
path: root/sort/merge.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2020-07-26 08:48:45 +0100
committerPaul Buetow <paul@buetow.org>2020-07-26 08:48:45 +0100
commitd330522b31f9a32e9549745008b596fdca9b17e5 (patch)
tree610a283416d66ca81c9d83ab3026c7fb770e616d /sort/merge.go
parentde286db8594d547591ff765f4d5934d99248779b (diff)
also have bottom-up merge sort
Diffstat (limited to 'sort/merge.go')
-rw-r--r--sort/merge.go49
1 files changed, 49 insertions, 0 deletions
diff --git a/sort/merge.go b/sort/merge.go
new file mode 100644
index 0000000..e57ea6d
--- /dev/null
+++ b/sort/merge.go
@@ -0,0 +1,49 @@
+package sort
+
+import (
+ "algorithms/ds"
+)
+
+func Merge(a ds.ArrayList) ds.ArrayList {
+ aux := make(ds.ArrayList, len(a))
+ mergeSort(a, aux, 0, len(a)-1)
+
+ return a
+}
+
+func mergeSort(a, aux ds.ArrayList, lo, hi int) {
+ if lo >= hi {
+ return
+ }
+ mid := lo + (hi-lo)/2
+
+ mergeSort(a, aux, lo, mid)
+ mergeSort(a, aux, mid+1, hi)
+ merge(a, aux, lo, mid, hi)
+}
+
+func merge(a, aux ds.ArrayList, lo, mid, hi int) {
+ for i := lo; i <= hi; i++ {
+ aux[i] = a[i]
+ }
+
+ i := lo
+ j := mid + 1
+
+ for k := lo; k <= hi; k++ {
+ switch {
+ case i > mid:
+ a[k] = aux[j]
+ j++
+ case j > hi:
+ a[k] = aux[i]
+ i++
+ case aux[i].Higher(aux[j]):
+ a[k] = aux[j]
+ j++
+ default:
+ a[k] = aux[i]
+ i++
+ }
+ }
+}