📖 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
Step 1: Understand the divide and conquer approach
Merge Sort splits the list into smaller parts to make sorting easier.
Step 2: Combine sorted parts
After sorting each half, it merges them to get a fully sorted list.
Final Answer:
Divide the list into halves, sort each half, then merge them -> Option D
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
Step 1: Identify input and output types
Merge Sort takes a slice of integers and returns a sorted slice of integers.
Step 2: Match function signature
Only func mergeSort(arr []int) []int matches input as []int and output as []int.
Final Answer:
func mergeSort(arr []int) []int -> Option A
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
Step 1: Trace recursive splitting
Array splits into [4,1] and [3,2], then further splits until single elements.
Step 2: Merge sorted halves
Merge combines sorted parts stepwise: [1,4], [2,3], then [1,2,3,4].
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
Step 1: Check how remaining elements are appended
The code uses append(result, left[i:]) which appends a slice as one element, not elements.
Step 2: Correct append syntax
It should use append(result, left[i:]...) to append all elements individually.
Final Answer:
Incorrect slice append syntax for left and right remaining elements -> Option A
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
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.
Step 2: Evaluate memory and recursion claims
Merge sort uses extra memory and recursion; bubble sort is in-place but slow.
Final Answer:
Merge sort has better average and worst-case time complexity (O(n log n)) than bubble sort (O(n^2)) -> Option B
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 unknownstrongwhile earning +1 Grip toward your certificate.