diff options
| author | mo khan <mo@mokhan.ca> | 2021-09-26 17:48:33 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2021-09-26 17:48:33 -0600 |
| commit | b55090ddf6ca27a853c8687def4a8bbdf9115ad8 (patch) | |
| tree | fe8ce3b4300c3e20fe1c2e47384a97f3dbd33974 /exercises/2.3-2 | |
| parent | 1d1ea8f67365a4faf1f35ab2d351663f31dd1c3f (diff) | |
implement a merge sort
Diffstat (limited to 'exercises/2.3-2')
| -rw-r--r-- | exercises/2.3-2/merge_sort_test.go | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/exercises/2.3-2/merge_sort_test.go b/exercises/2.3-2/merge_sort_test.go new file mode 100644 index 0000000..95f5307 --- /dev/null +++ b/exercises/2.3-2/merge_sort_test.go @@ -0,0 +1,85 @@ +package main + +import ( + "fmt" + "reflect" + "testing" +) + +func Merge(left []int, right []int) []int { + total := len(left) + len(right) + items := []int{} + + for i := 0; i < total; i++ { + if len(left) == 0 || len(right) == 0 { + break + } + if left[0] < right[0] { + items, left = append(items, left[0]), left[1:] + } else { + items, right = append(items, right[0]), right[1:] + } + } + for _, item := range left { + items = append(items, item) + } + for _, item := range right { + items = append(items, item) + } + return items +} + +func MergeSort(A []int) []int { + length := len(A) + + if length <= 1 { + return A + } + + mid := length / 2 + left := MergeSort(A[0:mid]) + right := MergeSort(A[mid:]) + return Merge(left, right) +} + +func TestMergeSort(t *testing.T) { + table := []struct { + in []int + out []int + }{ + { + in: []int{3}, + out: []int{3}, + }, + { + in: []int{3, 41}, + out: []int{3, 41}, + }, + { + in: []int{41, 3}, + out: []int{3, 41}, + }, + { + in: []int{3, 3}, + out: []int{3, 3}, + }, + { + in: []int{3, 41, 9}, + out: []int{3, 9, 41}, + }, + { + in: []int{3, 41, 52, 26, 38, 57, 9, 49}, + out: []int{3, 9, 26, 38, 41, 49, 52, 57}, + }, + } + + for _, test := range table { + t.Run(fmt.Sprintf("Sort %v", test.in), func(t *testing.T) { + results := MergeSort(test.in) + + if !reflect.DeepEqual(results, test.out) { + t.Errorf("Expected: %v, Got: %v", test.out, test.in) + } + }) + } +} |
