Bird
Raised Fist0
DSA Goprogramming~20 mins

Sorting Stability and When to Use Which Sort in DSA Go - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Sorting Stability Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this stable sort on a list of structs?

Given a list of structs with fields value and id, a stable sort is applied by value. What is the order of id after sorting?

DSA Go
package main

import (
	"fmt"
	"sort"
)

type item struct {
	value int
	id    int
}

func main() {
	items := []item{{3, 1}, {1, 2}, {3, 3}, {2, 4}}
	sort.SliceStable(items, func(i, j int) bool {
		return items[i].value < items[j].value
	})
	for _, it := range items {
		fmt.Print(it.id, " ")
	}
}
A2 4 3 1
B1 3 4 2
C4 2 1 3
D2 4 1 3
Attempts:
2 left
💡 Hint

Stable sort keeps the original order of equal elements.

🧠 Conceptual
intermediate
1:30remaining
Which sorting algorithm is stable by default?

Choose the sorting algorithm that is stable by default without extra modifications.

AMerge Sort
BSelection Sort
CHeap Sort
DQuick Sort
Attempts:
2 left
💡 Hint

Think about which algorithm merges sorted lists preserving order.

🚀 Application
advanced
1:30remaining
When should you prefer an unstable sort over a stable sort?

Choose the best scenario to prefer an unstable sort algorithm.

AWhen memory usage must be minimal and speed is critical
BWhen sorting linked lists where stability is guaranteed
CWhen you need to preserve the relative order of equal elements
DWhen sorting small arrays where stability is required
Attempts:
2 left
💡 Hint

Unstable sorts often use less memory and can be faster.

🔧 Debug
advanced
2:00remaining
What error occurs in this Go code using sort.Slice instead of sort.SliceStable?

What is the output or error of this code that sorts a slice of structs by value but uses sort.Slice instead of sort.SliceStable?

DSA Go
package main

import (
	"fmt"
	"sort"
)

type item struct {
	value int
	id    int
}

func main() {
	items := []item{{3, 1}, {1, 2}, {3, 3}, {2, 4}}
	sort.Slice(items, func(i, j int) bool {
		return items[i].value < items[j].value
	})
	for _, it := range items {
		fmt.Print(it.id, " ")
	}
}
A2 4 1 3
B2 4 3 1
CCompilation error
DRuntime panic
Attempts:
2 left
💡 Hint

sort.Slice is not stable, so equal elements may reorder.

🧠 Conceptual
expert
2:00remaining
Why is stability important in multi-level sorting?

Choose the best explanation why stable sorting is crucial when sorting by multiple keys in sequence.

AIt guarantees the fastest sorting time for large datasets
BIt reduces the total number of comparisons needed
CIt preserves the order of previous sorts when sorting by the next key
DIt allows sorting in place without extra memory
Attempts:
2 left
💡 Hint

Think about sorting by one key, then sorting again by another key without losing the first order.

Practice

(1/5)
1. What does it mean when a sorting algorithm is called stable?
easy
A. It keeps the original order of equal elements after sorting
B. It sorts elements faster than any other algorithm
C. It uses less memory than unstable sorts
D. It only works on numbers, not strings

Solution

  1. Step 1: Understand stability in sorting

    A stable sort keeps the relative order of items that compare equal the same as before sorting.
  2. Step 2: Compare options

    Only It keeps the original order of equal elements after sorting describes this property correctly. Other options describe speed, memory, or data type restrictions, which are unrelated to stability.
  3. Final Answer:

    It keeps the original order of equal elements after sorting -> Option A
  4. Quick Check:

    Stable sort = keeps equal items order [OK]
Hint: Stable means equal items keep their original order [OK]
Common Mistakes:
  • Confusing stability with speed
  • Thinking stability means less memory use
  • Believing stability depends on data type
2. Which of the following Go code snippets correctly uses the sort.SliceStable function to sort a slice of structs by an integer field Age?
easy
A. sort.SliceStable(people, func(i, j int) bool { return people[i].Age > people[j].Age })
B. sort.Slice(people, func(i, j int) bool { return people[i].Age > people[j].Age })
C. sort.Slice(people, func(i, j int) bool { return people[i].Age < people[j].Age })
D. sort.SliceStable(people, func(i, j int) bool { return people[i].Age < people[j].Age })

Solution

  1. Step 1: Identify stable sort usage

    The question asks for stable sorting by Age ascending. sort.SliceStable is the stable function.
  2. Step 2: Check comparison function

    The comparison must be people[i].Age < people[j].Age for ascending order.
  3. Final Answer:

    sort.SliceStable(people, func(i, j int) bool { return people[i].Age < people[j].Age }) -> Option D
  4. Quick Check:

    Stable + ascending = sort.SliceStable(people, func(i, j int) bool { return people[i].Age < people[j].Age }) [OK]
Hint: Use SliceStable with less-than for ascending stable sort [OK]
Common Mistakes:
  • Using sort.Slice instead of sort.SliceStable
  • Reversing comparison for ascending order
  • Mixing stable and unstable sort functions
3. Given the following Go code, what will be the output after sorting?
type Item struct {
  Name string
  Rank int
}

items := []Item{{"A", 2}, {"B", 1}, {"C", 2}}
sort.Slice(items, func(i, j int) bool { return items[i].Rank < items[j].Rank })
for _, item := range items {
  fmt.Print(item.Name, " ")
}
medium
A. A C B
B. B A C
C. B C A
D. C A B

Solution

  1. Step 1: Understand sorting criteria

    The slice is sorted by Rank ascending using sort.Slice, which is unstable.
  2. Step 2: Analyze order of equal Rank elements

    Items with Rank 2 are "A" and "C". Since sort.Slice is unstable, their relative order may change. The output shows "B" first (Rank 1), then "C", then "A".
  3. Final Answer:

    B C A -> Option C
  4. Quick Check:

    Unstable sort may change equal items order [OK]
Hint: Unstable sort may reorder equal keys; check output carefully [OK]
Common Mistakes:
  • Assuming stable order with sort.Slice
  • Mixing up item names and ranks
  • Ignoring unstable sort behavior
4. The following Go code attempts to sort a slice of strings stably by length but does not work as expected. What is the error?
words := []string{"cat", "bat", "apple", "dog"}
sort.Slice(words, func(i, j int) bool { return len(words[i]) < len(words[j]) })
medium
A. Using sort.Slice instead of sort.SliceStable causes unstable sort
B. The comparison function should use > instead of <
C. The slice must be converted to []struct before sorting
D. The code is correct and stable by default

Solution

  1. Step 1: Identify sorting function used

    The code uses sort.Slice, which is unstable.
  2. Step 2: Understand stability requirement

    To sort stably by length, sort.SliceStable must be used instead.
  3. Final Answer:

    Using sort.Slice instead of sort.SliceStable causes unstable sort -> Option A
  4. Quick Check:

    Stable sort requires SliceStable, not Slice [OK]
Hint: Use SliceStable for stable sorting, not Slice [OK]
Common Mistakes:
  • Thinking comparison direction affects stability
  • Believing slice type conversion is needed
  • Assuming sort.Slice is stable
5. You have a list of employees with fields Name and Department. You want to sort them first by Department alphabetically and then by Name alphabetically within each department, preserving the order of employees with the same name. Which sorting approach is best in Go?
hard
A. Use one unstable sort by Department only
B. Use two stable sorts: first by Name, then by Department
C. Use one stable sort by concatenated Department+Name string
D. Use two unstable sorts: first by Department, then by Name

Solution

  1. Step 1: Understand multi-level sorting with stability

    To sort by Department then Name, stable sorts allow sorting by the secondary key first, then primary key.
  2. Step 2: Apply stable sorts in correct order

    Sort first by Name (secondary key) stably, then by Department (primary key) stably. This preserves Name order within Departments.
  3. Final Answer:

    Use two stable sorts: first by Name, then by Department -> Option B
  4. Quick Check:

    Two stable sorts in reverse order = correct multi-level sort [OK]
Hint: Sort by secondary key first, then primary key with stable sorts [OK]
Common Mistakes:
  • Using unstable sorts causing order loss
  • Sorting primary key first losing secondary order
  • Trying one sort on combined keys without stability
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