Bird
Raised Fist0
DSA Goprogramming~30 mins

Merge Sort as Divide and Conquer in DSA Go - Build from Scratch

Choose your learning style10 modes available
Merge Sort as Divide and Conquer
📖 Scenario: You are helping a librarian organize a small shelf of books by their ID numbers. The librarian wants the books sorted from smallest to largest ID so they can find them quickly.
🎯 Goal: Build a program that sorts a list of book IDs using the merge sort method, which splits the list into smaller parts, sorts those parts, and then merges them back together in order.
📋 What You'll Learn
Create a slice called books with the exact values 38, 27, 43, 3, 9, 82, 10
Create a variable called mid to find the middle index of the slice
Write a function called mergeSort that splits the slice, sorts each half, and merges them
Print the sorted books slice after calling mergeSort
💡 Why This Matters
🌍 Real World
Sorting is used everywhere, like organizing books, files, or data to find things quickly.
💼 Career
Understanding merge sort helps in jobs that require efficient data processing and algorithm design.
Progress0 / 4 steps
1
Create the initial list of book IDs
Create a slice called books with these exact values: 38, 27, 43, 3, 9, 82, 10
DSA Go
Hint

Use books := []int{38, 27, 43, 3, 9, 82, 10} to create the slice.

2
Find the middle index to split the list
Create a variable called mid that stores the middle index of the books slice using len(books) / 2
DSA Go
Hint

Use mid := len(books) / 2 to find the middle index.

3
Write the mergeSort function to sort the list
Write a function called mergeSort that takes a slice of ints called arr and returns a sorted slice of ints. Use divide and conquer: if the length of arr is less than 2, return arr. Otherwise, split arr into two halves using mid := len(arr) / 2, recursively call mergeSort on each half, and merge the two sorted halves using a helper function called merge.
DSA Go
Hint

Remember to write a helper function merge to combine two sorted slices.

4
Print the sorted list of book IDs
Call mergeSort on the books slice and print the sorted result using fmt.Println
DSA Go
Hint

Use sortedBooks := mergeSort(books) and then fmt.Println(sortedBooks).

Practice

(1/5)
1. What is the main idea behind the Merge Sort algorithm?
easy
A. Insert elements one by one into a sorted list
B. Sort the list by repeatedly swapping adjacent elements
C. Select a pivot and partition the list around it
D. Divide the list into halves, sort each half, then merge them

Solution

  1. Step 1: Understand the divide and conquer approach

    Merge Sort splits the list into smaller parts to make sorting easier.
  2. Step 2: Combine sorted parts

    After sorting each half, it merges them to get a fully sorted list.
  3. Final Answer:

    Divide the list into halves, sort each half, then merge them -> Option D
  4. Quick Check:

    Merge Sort = Divide, Sort, Merge [OK]
Hint: Remember: split, sort, then merge [OK]
Common Mistakes:
  • Confusing Merge Sort with Bubble Sort
  • Thinking Merge Sort sorts in place without merging
  • Mixing up pivot selection with Quick Sort
2. Which of the following is the correct way to declare a recursive mergeSort function signature in Go?
easy
A. func mergeSort(arr []int) []int
B. func mergeSort(arr int) int
C. func mergeSort(arr []int)
D. func mergeSort(arr []int) int

Solution

  1. Step 1: Identify input and output types

    Merge Sort takes a slice of integers and returns a sorted slice of integers.
  2. Step 2: Match function signature

    Only func mergeSort(arr []int) []int matches input as []int and output as []int.
  3. Final Answer:

    func mergeSort(arr []int) []int -> Option A
  4. Quick Check:

    Input and output are slices of int [OK]
Hint: Function returns sorted slice, so output is []int [OK]
Common Mistakes:
  • Using int instead of []int for input or output
  • Missing return type for sorted slice
  • Confusing parameter types
3. What will be the output of the following Go code snippet using merge sort?
func main() {
  arr := []int{4, 1, 3, 2}
  sorted := mergeSort(arr)
  fmt.Println(sorted)
}

func mergeSort(arr []int) []int {
  if len(arr) <= 1 {
    return arr
  }
  mid := len(arr) / 2
  left := mergeSort(arr[:mid])
  right := mergeSort(arr[mid:])
  return merge(left, right)
}

func merge(left, right []int) []int {
  result := []int{}
  i, j := 0, 0
  for i < len(left) && j < len(right) {
    if left[i] < right[j] {
      result = append(result, left[i])
      i++
    } else {
      result = append(result, right[j])
      j++
    }
  }
  result = append(result, left[i:]...)
  result = append(result, right[j:]...)
  return result
}
medium
A. [4 3 2 1]
B. [1 3 2 4]
C. [1 2 3 4]
D. [2 1 3 4]

Solution

  1. Step 1: Trace recursive splitting

    Array splits into [4,1] and [3,2], then further splits until single elements.
  2. Step 2: Merge sorted halves

    Merge combines sorted parts stepwise: [1,4], [2,3], then [1,2,3,4].
  3. Final Answer:

    [1 2 3 4] -> Option C
  4. Quick Check:

    Sorted array = [1 2 3 4] [OK]
Hint: Merge Sort always returns sorted array ascending [OK]
Common Mistakes:
  • Confusing merge order causing wrong output
  • Forgetting to merge remaining elements
  • Incorrect base case handling
4. Identify the bug in this merge function used in merge sort:
func merge(left, right []int) []int {
  result := []int{}
  i, j := 0, 0
  for i < len(left) && j < len(right) {
    if left[i] <= right[j] {
      result = append(result, left[i])
      i++
    } else {
      result = append(result, right[j])
      j++
    }
  }
  result = append(result, left[i:])
  result = append(result, right[j:])
  return result
}
medium
A. Incorrect slice append syntax for left and right remaining elements
B. Wrong comparison operator in if condition
C. Missing initialization of result slice
D. Loop condition should use || instead of &&

Solution

  1. Step 1: Check how remaining elements are appended

    The code uses append(result, left[i:]) which appends a slice as one element, not elements.
  2. Step 2: Correct append syntax

    It should use append(result, left[i:]...) to append all elements individually.
  3. Final Answer:

    Incorrect slice append syntax for left and right remaining elements -> Option A
  4. Quick Check:

    Use ... to append slice elements [OK]
Hint: Use ... to append slice elements, not slice itself [OK]
Common Mistakes:
  • Appending slice without ... causes nested slices
  • Changing comparison operator unnecessarily
  • Using || instead of && in loop condition
5. Given a large list of 1 million integers, which of these is the best reason to choose merge sort over bubble sort?
hard
A. Merge sort uses less memory than bubble sort because it sorts in place
B. Merge sort has better average and worst-case time complexity (O(n log n)) than bubble sort (O(n^2))
C. Bubble sort is faster for large lists because it swaps elements directly
D. Merge sort does not require recursion, so it uses less stack space

Solution

  1. Step 1: Compare time complexities

    Merge sort runs in O(n log n), which is much faster than bubble sort's O(n^2) for large n.
  2. Step 2: Evaluate memory and recursion claims

    Merge sort uses extra memory and recursion; bubble sort is in-place but slow.
  3. Final Answer:

    Merge sort has better average and worst-case time complexity (O(n log n)) than bubble sort (O(n^2)) -> Option B
  4. Quick Check:

    Time complexity matters most for large lists [OK]
Hint: Choose O(n log n) over O(n^2) for big data [OK]
Common Mistakes:
  • Assuming bubble sort is faster for large data
  • Thinking merge sort is in-place
  • Ignoring recursion stack usage
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard