diff options
| author | Paul Buetow <paul@buetow.org> | 2020-07-26 08:48:45 +0100 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2020-07-26 08:48:45 +0100 |
| commit | d330522b31f9a32e9549745008b596fdca9b17e5 (patch) | |
| tree | 610a283416d66ca81c9d83ab3026c7fb770e616d /sort/merge.go | |
| parent | de286db8594d547591ff765f4d5934d99248779b (diff) | |
also have bottom-up merge sort
Diffstat (limited to 'sort/merge.go')
| -rw-r--r-- | sort/merge.go | 49 |
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++ + } + } +} |
