Bird
Raised Fist0
DSA Javascriptprogramming~20 mins

Radix Sort Algorithm in DSA Javascript - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Radix Sort Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Radix Sort on a small array
What is the output of the following JavaScript code that uses Radix Sort to sort an array of positive integers?
DSA Javascript
function radixSort(arr) {
  const maxNum = Math.max(...arr);
  let digit = 1;
  while (parseInt(maxNum / digit) > 0) {
    let buckets = Array.from({ length: 10 }, () => []);
    for (let num of arr) {
      let digitNum = parseInt((num / digit) % 10);
      buckets[digitNum].push(num);
    }
    arr = [].concat(...buckets);
    digit *= 10;
  }
  return arr;
}

const input = [170, 45, 75, 90, 802, 24, 2, 66];
console.log(radixSort(input));
A[24, 2, 45, 66, 75, 90, 170, 802]
B[802, 170, 90, 75, 66, 45, 24, 2]
C[2, 24, 45, 66, 75, 90, 170, 802]
D[2, 24, 45, 66, 75, 170, 90, 802]
Attempts:
2 left
💡 Hint
Think about how Radix Sort sorts numbers digit by digit from least significant to most significant.
🧠 Conceptual
intermediate
1:30remaining
Understanding Radix Sort Buckets
In Radix Sort, what is the purpose of using buckets during each digit iteration?
ATo reverse the array after sorting each digit.
BTo group numbers based on the current digit being processed, so they can be collected in order.
CTo store the final sorted array after all digits are processed.
DTo count how many times each digit appears in the array.
Attempts:
2 left
💡 Hint
Think about how numbers are grouped by digits before combining them back.
❓ Predict Output
advanced
2:30remaining
Radix Sort with Negative Numbers
What will be the output of this modified Radix Sort code when sorting an array containing negative and positive integers?
DSA Javascript
function radixSortWithNegatives(arr) {
  const positives = arr.filter(x => x >= 0);
  const negatives = arr.filter(x => x < 0).map(x => Math.abs(x));

  function sort(nums) {
    const maxNum = Math.max(...nums);
    let digit = 1;
    while (parseInt(maxNum / digit) > 0) {
      let buckets = Array.from({ length: 10 }, () => []);
      for (let num of nums) {
        let digitNum = parseInt((num / digit) % 10);
        buckets[digitNum].push(num);
      }
      nums = [].concat(...buckets);
      digit *= 10;
    }
    return nums;
  }

  const sortedPositives = sort(positives);
  const sortedNegatives = sort(negatives).map(x => -x).reverse();

  return [...sortedNegatives, ...sortedPositives];
}

const input = [170, -45, 75, -90, 802, 24, -2, 66];
console.log(radixSortWithNegatives(input));
A[-90, -45, -2, 24, 66, 75, 170, 802]
B[-90, -45, -2, 802, 170, 75, 66, 24]
C[-2, -45, -90, 24, 66, 75, 170, 802]
D[24, 66, 75, 170, 802, -2, -45, -90]
Attempts:
2 left
💡 Hint
Negative numbers are sorted by absolute value then reversed and negated to keep correct order.
🔧 Debug
advanced
2:00remaining
Identify the bug in Radix Sort implementation
What error or issue will occur when running this Radix Sort code?
DSA Javascript
function radixSortBug(arr) {
  const maxNum = Math.max(...arr);
  let digit = 1;
  while (maxNum / digit > 0) {
    let buckets = Array.from({ length: 10 }, () => []);
    for (let num of arr) {
      let digitNum = Math.floor((num / digit) % 10);
      buckets[digitNum].push(num);
    }
    arr = [].concat(...buckets);
    digit *= 10;
  }
  return arr;
}

const input = [170, 45, 75, 90, 802, 24, 2, 66];
console.log(radixSortBug(input));
AInfinite loop because the while condition never becomes false.
BSyntaxError due to missing parentheses in Math.floor.
CTypeError because buckets is not an array.
DCorrect output: [2, 24, 45, 66, 75, 90, 170, 802]
Attempts:
2 left
💡 Hint
Check the while loop condition and how it changes each iteration.
🚀 Application
expert
3:00remaining
Radix Sort Stability and Output Order
Given the array of objects below, sorted by their 'value' property using Radix Sort, what will be the order of objects after sorting?
DSA Javascript
function radixSortObjects(arr) {
  const maxNum = Math.max(...arr.map(o => o.value));
  let digit = 1;
  while (Math.floor(maxNum / digit) > 0) {
    let buckets = Array.from({ length: 10 }, () => []);
    for (let obj of arr) {
      let digitNum = Math.floor((obj.value / digit) % 10);
      buckets[digitNum].push(obj);
    }
    arr = [].concat(...buckets);
    digit *= 10;
  }
  return arr;
}

const input = [
  {id: 'a', value: 21},
  {id: 'b', value: 12},
  {id: 'c', value: 21},
  {id: 'd', value: 10}
];

const sorted = radixSortObjects(input);
console.log(sorted.map(o => o.id));
A['d', 'a', 'c', 'b']
B['b', 'd', 'a', 'c']
C['a', 'c', 'b', 'd']
D['d', 'b', 'a', 'c']
Attempts:
2 left
💡 Hint
Radix Sort is stable, so objects with the same value keep their original relative order.

Practice

(1/5)
1. What is the main idea behind the Radix Sort Algorithm?
easy
A. Sort numbers by swapping adjacent elements repeatedly
B. Sort numbers by comparing each pair directly
C. Sort numbers by dividing them into two halves recursively
D. Sort numbers digit by digit starting from the least significant digit

Solution

  1. Step 1: Understand Radix Sort approach

    Radix Sort sorts numbers by processing each digit separately, starting from the least significant digit (rightmost).
  2. Step 2: Compare with other sorting methods

    Unlike comparison-based sorts, Radix Sort groups numbers by digits without direct comparisons between whole numbers.
  3. Final Answer:

    Sort numbers digit by digit starting from the least significant digit -> Option D
  4. Quick Check:

    Radix Sort = Digit by digit sorting [OK]
Hint: Radix Sort processes digits from right to left [OK]
Common Mistakes:
  • Thinking Radix Sort compares whole numbers directly
  • Confusing Radix Sort with quicksort or mergesort
  • Assuming it sorts from most significant digit first
2. Which of the following is the correct way to initialize a bucket array for Radix Sort in JavaScript?
easy
A. const buckets = [].map(() => []);
B. const buckets = new Array(10).fill([]);
C. const buckets = Array.from({ length: 10 }, () => []);
D. const buckets = Array(10).fill(null);

Solution

  1. Step 1: Understand bucket initialization

    We need 10 separate arrays (buckets) for digits 0-9. Using Array.from with a function creates independent arrays.
  2. Step 2: Why other options fail

    const buckets = new Array(10).fill([]); fills with the same array reference, causing all buckets to share one array. const buckets = [].map(() => []); fails because map on empty array does nothing. const buckets = Array(10).fill(null); fills with null, not arrays.
  3. Final Answer:

    const buckets = Array.from({ length: 10 }, () => []); -> Option C
  4. Quick Check:

    Use Array.from with function for separate buckets [OK]
Hint: Use Array.from with arrow function for unique buckets [OK]
Common Mistakes:
  • Using fill([]) creates shared references
  • Using map on uninitialized array returns empty
  • Filling buckets with null instead of arrays
3. What will be the output of the following JavaScript code snippet using Radix Sort on the array [170, 45, 75, 90, 802, 24, 2, 66]?
function getDigit(num, place) {
  return Math.floor(Math.abs(num) / Math.pow(10, place)) % 10;
}

function radixSort(arr) {
  let maxDigit = Math.floor(Math.log10(Math.max(...arr))) + 1;
  for (let k = 0; k < maxDigit; k++) {
    let buckets = Array.from({ length: 10 }, () => []);
    for (let num of arr) {
      buckets[getDigit(num, k)].push(num);
    }
    arr = [].concat(...buckets);
  }
  return arr;
}

console.log(radixSort([170, 45, 75, 90, 802, 24, 2, 66]));
medium
A. [170, 45, 75, 90, 802, 24, 2, 66]
B. [2, 24, 45, 66, 75, 90, 170, 802]
C. [802, 170, 90, 75, 66, 45, 24, 2]
D. [2, 24, 45, 66, 75, 170, 90, 802]

Solution

  1. Step 1: Understand digit extraction and sorting

    The code sorts numbers by each digit from least significant (units) to most significant. After each pass, numbers are grouped by that digit.
  2. Step 2: Trace sorting passes

    After sorting by units digit, then tens, then hundreds, the array becomes fully sorted ascending: [2, 24, 45, 66, 75, 90, 170, 802].
  3. Final Answer:

    [2, 24, 45, 66, 75, 90, 170, 802] -> Option B
  4. Quick Check:

    Radix Sort output = Sorted ascending array [OK]
Hint: Radix Sort outputs sorted array ascending [OK]
Common Mistakes:
  • Confusing original array with sorted output
  • Misunderstanding digit extraction order
  • Assuming sorting is descending
4. Identify the bug in this Radix Sort snippet and choose the correct fix:
function radixSort(arr) {
  let maxDigit = Math.floor(Math.log10(Math.max(...arr))) + 1;
  for (let k = 0; k <= maxDigit; k++) {
    let buckets = Array.from({ length: 10 }, () => []);
    for (let num of arr) {
      buckets[Math.floor(num / Math.pow(10, k)) % 10].push(num);
    }
    arr = [].concat(...buckets);
  }
  return arr;
}
medium
A. Change loop condition to k < maxDigit instead of <= maxDigit
B. Initialize buckets with new Array(10).fill([])
C. Use Math.ceil instead of Math.floor for maxDigit
D. Remove Math.abs from digit calculation

Solution

  1. Step 1: Analyze loop range for digit passes

    The loop runs from 0 to maxDigit inclusive, causing one extra pass beyond needed digits.
  2. Step 2: Fix loop condition

    Changing k <= maxDigit to k < maxDigit ensures exactly maxDigit passes, avoiding unnecessary iteration.
  3. Final Answer:

    Change loop condition to k < maxDigit instead of <= maxDigit -> Option A
  4. Quick Check:

    Loop runs maxDigit times, not maxDigit+1 [OK]
Hint: Loop digits from 0 to less than maxDigit [OK]
Common Mistakes:
  • Using <= causes extra unnecessary pass
  • Initializing buckets incorrectly with shared arrays
  • Changing floor to ceil breaks digit count
5. You want to use Radix Sort to sort an array containing both positive and negative integers, like [170, -45, 75, -90, 802, 24, -2, 66]. Which approach correctly adapts Radix Sort for this case?
hard
A. Separate negative and positive numbers, sort positives with Radix Sort, sort negatives by absolute value then reverse, then combine
B. Apply Radix Sort directly on all numbers including negatives without changes
C. Convert all numbers to strings and sort lexicographically
D. Use Radix Sort only on positive numbers and ignore negatives

Solution

  1. Step 1: Understand Radix Sort limitation

    Radix Sort works only on non-negative integers because it sorts digits from least significant to most significant.
  2. Step 2: Adapt for negatives

    Separate negatives and positives. Sort positives normally. For negatives, sort their absolute values, then reverse the result to get correct order. Finally, combine negatives (in reversed order) before positives.
  3. Final Answer:

    Separate negative and positive numbers, sort positives with Radix Sort, sort negatives by absolute value then reverse, then combine -> Option A
  4. Quick Check:

    Separate negatives and positives, sort separately [OK]
Hint: Sort negatives by absolute then reverse, positives normally [OK]
Common Mistakes:
  • Trying to sort negatives directly with Radix Sort
  • Ignoring negative numbers in sorting
  • Sorting numbers as strings causing wrong order
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