diff --git a/Golang/Merge Sort Algorithm/go.mod b/Golang/Merge Sort Algorithm/go.mod new file mode 100644 index 0000000..72f93cd --- /dev/null +++ b/Golang/Merge Sort Algorithm/go.mod @@ -0,0 +1,3 @@ +module github.com/nikzayn/letsdocode + +go 1.21.1 diff --git a/Golang/Merge Sort Algorithm/main.go b/Golang/Merge Sort Algorithm/main.go new file mode 100644 index 0000000..75ca65d --- /dev/null +++ b/Golang/Merge Sort Algorithm/main.go @@ -0,0 +1,51 @@ +package main + +import "fmt" + +// MergeSort function +func MergeSort(arr []int) []int { + if len(arr) <= 1 { + return arr + } + + mid := len(arr) / 2 + left := arr[:mid] + right := arr[mid:] + + left = MergeSort(left) + right = MergeSort(right) + + return merge(left, right) +} + +// merge function +func merge(left, right []int) []int { + result := make([]int, 0) + + for len(left) > 0 || len(right) > 0 { + if len(left) > 0 && len(right) > 0 { + if left[0] <= right[0] { + result = append(result, left[0]) + left = left[1:] + } else { + result = append(result, right[0]) + right = right[1:] + } + } else if len(left) > 0 { + result = append(result, left[0]) + left = left[1:] + } else if len(right) > 0 { + result = append(result, right[0]) + right = right[1:] + } + } + + return result +} + +func main() { + arr := []int{12, 11, 13, 5, 6, 7} + fmt.Println("Unsorted array:", arr) + sortedArr := MergeSort(arr) + fmt.Println("Sorted array:", sortedArr) +} diff --git a/Golang/Merge Sort Algorithm/main_test.go b/Golang/Merge Sort Algorithm/main_test.go new file mode 100644 index 0000000..d821f10 --- /dev/null +++ b/Golang/Merge Sort Algorithm/main_test.go @@ -0,0 +1,50 @@ +package main + +import ( + "math/rand" + "reflect" + "testing" + "time" +) + +func TestMergeSort(t *testing.T) { + // Test case 1: Sorting an empty slice should return an empty slice. + arr1 := []int{} + expected1 := []int{} + result1 := MergeSort(arr1) + if !reflect.DeepEqual(result1, expected1) { + t.Errorf("Test case 1 failed. Expected: %v, got: %v", expected1, result1) + } + + // Test case 2: Sorting a slice with one element should return the same slice. + arr2 := []int{5} + expected2 := []int{5} + result2 := MergeSort(arr2) + if !reflect.DeepEqual(result2, expected2) { + t.Errorf("Test case 2 failed. Expected: %v, got: %v", expected2, result2) + } + + // Test case 3: Sorting a slice with multiple elements. + arr3 := []int{12, 11, 13, 5, 6, 7} + expected3 := []int{5, 6, 7, 11, 12, 13} + result3 := MergeSort(arr3) + if !reflect.DeepEqual(result3, expected3) { + t.Errorf("Test case 3 failed. Expected: %v, got: %v", expected3, result3) + } +} + +func generateRandomSlice(size int) []int { + rand.Seed(time.Now().UnixNano()) + arr := make([]int, size) + for i := 0; i < size; i++ { + arr[i] = rand.Intn(1000) // Generate random numbers between 0 and 999 + } + return arr +} + +func BenchmarkMergeSort(b *testing.B) { + for i := 0; i < b.N; i++ { + input := generateRandomSlice(1000) // Adjust the slice size as needed + MergeSort(input) + } +}