Bird
Raised Fist0
DSA Javascriptprogramming

Counting Sort Algorithm in DSA Javascript

Choose your learning style10 modes available
Mental Model
Counting sort counts how many times each number appears, then uses these counts to place numbers in order without comparing them.
Analogy: Imagine sorting colored balls by putting them into labeled boxes for each color, then taking them out in order to get a sorted line of balls.
Input array: [4, 2, 2, 8, 3, 3, 1]
Count array: [0, 1, 2, 2, 1, 0, 0, 0, 1]
Sorted output: []
Dry Run Walkthrough
Input: array: [4, 2, 2, 8, 3, 3, 1]
Goal: Sort the array in ascending order using counting sort
Step 1: Count how many times each number appears
Count array: [0, 1, 2, 2, 1, 0, 0, 0, 1]
Why: We need to know the frequency of each number to place them correctly
Step 2: Change counts to cumulative counts
Count array: [0, 1, 3, 5, 6, 6, 6, 6, 7]
Why: Cumulative counts tell us the position where each number should go
Step 3: Place numbers into output array from right to left using cumulative counts
Output array after placing all: [1, 2, 2, 3, 3, 4, 8]
Why: Placing from right to left keeps the sort stable and uses counts to find positions
Result:
Sorted array: [1, 2, 2, 3, 3, 4, 8]
Annotated Code
DSA Javascript
class CountingSort {
  static sort(arr) {
    if (arr.length === 0) return arr;

    // Find max value to size count array
    const max = Math.max(...arr);
    const count = new Array(max + 1).fill(0);

    // Count occurrences
    for (const num of arr) {
      count[num]++;
    }

    // Change count to cumulative count
    for (let i = 1; i < count.length; i++) {
      count[i] += count[i - 1];
    }

    const output = new Array(arr.length);

    // Place elements in output array from right to left
    for (let i = arr.length - 1; i >= 0; i--) {
      const num = arr[i];
      count[num]--;
      output[count[num]] = num;
    }

    return output;
  }
}

// Driver code
const input = [4, 2, 2, 8, 3, 3, 1];
const sorted = CountingSort.sort(input);
console.log(sorted.join(", ") + "\n");
const max = Math.max(...arr);
Find the largest number to know count array size
for (const num of arr) { count[num]++; }
Count how many times each number appears
for (let i = 1; i < count.length; i++) { count[i] += count[i - 1]; }
Convert counts to cumulative counts for positions
for (let i = arr.length - 1; i >= 0; i--) { count[num]--; output[count[num]] = num; }
Place elements in output array from right to left using counts
OutputSuccess
1, 2, 2, 3, 3, 4, 8
Complexity Analysis
Time: O(n + k) because we count frequencies and then place elements, where n is array length and k is max value
Space: O(n + k) because we use output array of size n and count array of size k+1
vs Alternative: Unlike comparison sorts (O(n log n)), counting sort is faster for small ranges but uses extra space
Edge Cases
empty array
returns empty array immediately
DSA Javascript
if (arr.length === 0) return arr;
array with one element
returns array as is
DSA Javascript
handles naturally without special code
array with all same elements
returns array unchanged but sorted
DSA Javascript
counting and placement still works correctly
When to Use This Pattern
When you need to sort integers with a small range quickly and without comparisons, use counting sort because it counts frequencies and places elements directly.
Common Mistakes
Mistake: Not converting counts to cumulative counts before placement
Fix: Add loop to convert counts to cumulative counts before placing elements
Mistake: Placing elements from left to right causing unstable sort
Fix: Place elements from right to left to maintain stability
Summary
Counting sort sorts numbers by counting their occurrences and using these counts to place them in order.
Use it when sorting integers with a limited range for fast, non-comparison sorting.
The key insight is converting counts to cumulative counts to find exact positions for each number.

Practice

(1/5)
1. What is the main idea behind the Counting Sort Algorithm?
easy
A. Swap adjacent elements if they are in wrong order repeatedly
B. Compare each element with every other element to sort
C. Count the occurrences of each element and use counts to place elements in order
D. Divide the array into halves and sort recursively

Solution

  1. Step 1: Understand Counting Sort principle

    Counting sort counts how many times each value appears in the input array.
  2. Step 2: Use counts to place elements

    Using these counts, it calculates positions to place each element in the sorted output.
  3. Final Answer:

    Count the occurrences of each element and use counts to place elements in order -> Option C
  4. Quick Check:

    Counting elements = Counting Sort [OK]
Hint: Counting sort counts elements, no comparisons needed [OK]
Common Mistakes:
  • Thinking counting sort compares elements like bubble sort
  • Confusing counting sort with divide and conquer methods
  • Assuming counting sort works on all data types
2. Which of the following is the correct way to initialize the count array in Counting Sort for input array arr with maximum value maxVal in JavaScript?
easy
A. const count = new Array().fill(maxVal + 1);
B. const count = new Array(maxVal).fill(0);
C. const count = new Array(arr.length).fill(0);
D. const count = new Array(maxVal + 1).fill(0);

Solution

  1. Step 1: Determine size of count array

    The count array must cover all values from 0 to maxVal, so size is maxVal + 1.
  2. Step 2: Initialize count array with zeros

    Use new Array(maxVal + 1).fill(0) to create and fill with zeros.
  3. Final Answer:

    const count = new Array(maxVal + 1).fill(0); -> Option D
  4. Quick Check:

    Count array size = maxVal + 1 [OK]
Hint: Count array length = max value + 1 [OK]
Common Mistakes:
  • Using maxVal instead of maxVal + 1 for array size
  • Using input array length instead of maxVal
  • Incorrectly filling array with maxVal + 1 instead of zeros
3. What will be the output of the following JavaScript code using Counting Sort?
function countingSort(arr) {
  const maxVal = Math.max(...arr);
  const count = new Array(maxVal + 1).fill(0);
  for (const num of arr) count[num]++;
  let sorted = [];
  for (let i = 0; i <= maxVal; i++) {
    while (count[i] > 0) {
      sorted.push(i);
      count[i]--;
    }
  }
  return sorted;
}

console.log(countingSort([4, 2, 2, 8, 3, 3, 1]));
medium
A. [1, 2, 2, 3, 3, 4, 8]
B. [8, 4, 3, 3, 2, 2, 1]
C. [1, 2, 3, 4, 8]
D. [4, 2, 2, 8, 3, 3, 1]

Solution

  1. Step 1: Count occurrences of each number

    Count array after counting: count[1]=1, count[2]=2, count[3]=2, count[4]=1, count[8]=1.
  2. Step 2: Build sorted array using counts

    Push each number count[i] times in ascending order: 1, 2, 2, 3, 3, 4, 8.
  3. Final Answer:

    [1, 2, 2, 3, 3, 4, 8] -> Option A
  4. Quick Check:

    Sorted array matches counting sort output [OK]
Hint: Counting sort output is sorted array with duplicates in order [OK]
Common Mistakes:
  • Returning original array instead of sorted
  • Reversing order by mistake
  • Missing duplicates in output
4. Identify the bug in this Counting Sort implementation and select the fix:
function countingSort(arr) {
  const maxVal = Math.max(...arr);
  const count = new Array(maxVal).fill(0);
  for (const num of arr) {
    count[num]++;
  }
  let sorted = [];
  for (let i = 0; i < maxVal; i++) {
    while (count[i] > 0) {
      sorted.push(i);
      count[i]--;
    }
  }
  return sorted;
}
medium
A. Change count array size to maxVal + 1 and loop to i <= maxVal
B. Initialize count array with zeros using fill(1)
C. Use for loop from i = 1 to maxVal instead of 0
D. Remove the while loop and use if condition instead

Solution

  1. Step 1: Check count array size and loop range

    Count array size is maxVal but should be maxVal + 1 to include maxVal index.
  2. Step 2: Fix loop to include maxVal index

    Loop should run from 0 to maxVal inclusive (i <= maxVal) to cover all counts.
  3. Final Answer:

    Change count array size to maxVal + 1 and loop to i <= maxVal -> Option A
  4. Quick Check:

    Count array size and loop range must match maxVal + 1 [OK]
Hint: Count array size = maxVal + 1; loop to i <= maxVal [OK]
Common Mistakes:
  • Using wrong count array size causing index errors
  • Looping less than needed, missing maxVal counts
  • Changing fill value incorrectly
5. Given an array arr = [5, 3, 0, 2, 3, 5, 1], how would you modify Counting Sort to sort only the elements between 1 and 4 inclusive, ignoring others?
hard
A. Use counting sort on full range but skip pushing elements outside 1 to 4
B. Count only elements between 1 and 4, then output sorted elements in that range
C. Sort entire array normally and then remove elements outside 1 to 4
D. Filter array first, then apply counting sort on filtered array

Solution

  1. Step 1: Count only elements in range 1 to 4

    Ignore elements outside 1 to 4 while counting to focus sorting on this range.
  2. Step 2: Output sorted elements only in that range

    Build sorted array using counts only for values 1 to 4, ignoring others.
  3. Final Answer:

    Count only elements between 1 and 4, then output sorted elements in that range -> Option B
  4. Quick Check:

    Counting and output limited to range [1,4] [OK]
Hint: Count and output only target range elements [OK]
Common Mistakes:
  • Sorting full array then filtering, wasting effort
  • Counting full range but skipping output incorrectly
  • Filtering after sorting instead of before
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