diff --git a/.gitignore b/.gitignore index 0020638..ccfeb97 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ _testmain.go sorting/bubble_sort sorting/selection_sort +sorting/merge_sort \ No newline at end of file diff --git a/README.md b/README.md index 16ba91b..20bfacd 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ alghoritms * bubble sort * selection sort + * merge sort todo ------ diff --git a/sorting/merge_sort.go b/sorting/merge_sort.go new file mode 100644 index 0000000..8713269 --- /dev/null +++ b/sorting/merge_sort.go @@ -0,0 +1,52 @@ +package main + +/* + * Merge sort - http://en.wikipedia.org/wiki/Merge_sort + */ + +import "fmt" + +import "github.com/IoSync/go-alghoritms" + +func Merge(left, right []int) []int { + result := make([]int, 0, len(left) + len(right)) + + for len(left) > 0 || len(right) > 0 { + if len(left) == 0 { + return append(result, right...) + } + if len(right) == 0 { + return append(result, left...) + } + if left[0] <= right[0] { + result = append(result, left[0]) + left = left[1:] + } else { + result = append(result, right[0]) + right = right[1:] + } + } + + return result +} + +func MergeSort(arr []int) []int { + if len(arr) <= 1 { + return arr + } + + middle := len(arr) / 2 + + left := MergeSort(arr[:middle]) + right := MergeSort(arr[middle:]) + + return Merge(left, right) +} + +func main() { + arr := utils.RandArray(10) + fmt.Println("Initial array is:", arr) + fmt.Println("") + fmt.Println("Sorted array: ", MergeSort(arr)) +} +