JavaScriptJavaScript Interview

JavaScript Interview Coding Challenge🧠: Sort Numbers in Ascending and Descending Order

JavaScript Interview Coding Challenge — Sort Numbers in Ascending and Descending Order

Designed to answer this questions like:
“sort numbers in ascending order JavaScript,”
“JavaScript interview coding challenge sort numbers,”
“descending sort JS,”
“array sort algorithm JavaScript,”
and dozens of long-tail variations.

(Complete Guide, Best Solutions, Algorithms, Theory, Performance, and SEO Optimization)


📝 Introduction

Sorting numbers is one of the most fundamental coding challenges you will encounter in JavaScript interviews. Interviewers use this task to check your understanding of:

  • JavaScript’s built-in methods
  • Sorting theory (comparison functions, numerical sorting, stable vs unstable algorithms)
  • Arrays and iteration
  • Algorithmic thinking
  • Time complexity reasoning
  • Clean coding practices

Although the problem sounds simple—“Sort numbers in ascending and descending order”—it is often a trap for beginners, because JavaScript’s default array sort is lexicographical (string-based), not numerical.

For example:

console.log([10, 2, 50].sort()); 
// Output: [10, 2, 50] ❌ NOT numeric order

Therefore, to sort numbers correctly, you must use a custom comparator function, typically (a, b) => a - b (ascending) or (a, b) => b - a (descending).

This article covers every detail you need for interviews:
✅ All sorting methods
✅ Internal JavaScript engine logic
✅ Comparator functions
✅ Full theory explanation
✅ Time and space complexity
✅ Real-world examples
✅ Edge cases
✅ High-level and low-level approaches


✅ Problem Statement

Write a function that sorts an array of numbers in ascending order and another function that sorts the same array in descending order.

Example:

Input:  [5, 2, 9, 1, 5, 6]

Ascending → [1, 2, 5, 5, 6, 9]  
Descending → [9, 6, 5, 5, 2, 1]

✅ Understanding JavaScript’s .sort() Behavior

Before solving the challenge, you must understand the trick behind JavaScript’s Array.prototype.sort():

✅ Default behavior: sorts as strings

Meaning:

"10" comes before "2"

Therefore:

[10, 2, 3].sort(); 
// → [10, 2, 3] WRONG (string comparison)

To sort numerically, we must define a comparator.


✅ Comparator Functions Explained

A comparator function receives two elements:

(a, b) => a - b

If result is:

  • < 0 → a comes before b
  • > 0 → b comes before a
  • 0 → order stays the same

✅ Approach 1 — Sort Numbers in Ascending Order

✅ The Correct Way

function sortAscending(arr) {
  return [...arr].sort((a, b) => a - b);
}

console.log(sortAscending([5, 2, 9, 1, 5, 6]));
// → [1, 2, 5, 5, 6, 9]

a - b ensures numeric ascending order
✅ Works for negative numbers
✅ Works for decimal numbers
[...] avoids mutating the original array


✅ Approach 2 — Sort Numbers in Descending Order

✅ Code:

function sortDescending(arr) {
  return [...arr].sort((a, b) => b - a);
}

console.log(sortDescending([5, 2, 9, 1, 5, 6]));
// → [9, 6, 5, 5, 2, 1]

b - a reverses the numeric comparison
✅ Perfect for leaderboard, ranking, sorting scores


✅ Approach 3 — Manual Sorting Using Bubble Sort (Often Asked in Interviews)

Even though .sort() is built-in, interviewers sometimes ask:

“Can you sort numbers without using .sort()?”

This tests algorithmic fundamentals.

✅ Bubble Sort Example:

function bubbleSortAscending(arr) {
  const a = [...arr];
  for (let i = 0; i < a.length - 1; i++) {
    for (let j = 0; j < a.length - 1 - i; j++) {
      if (a[j] > a[j + 1]) {
        [a[j], a[j + 1]] = [a[j + 1], a[j]];
      }
    }
  }
  return a;
}

console.log(bubbleSortAscending([5, 2, 9, 1, 5]));
// → [1, 2, 5, 5, 9]

Descending version simply reverses the comparison.

✅ Good for interviews
✅ Shows you know algorithmic fundamentals
✅ Not good for production use


✅ Approach 4 — Selection Sort (Simple Interview Alternative)

function selectionSortAscending(arr) {
  const a = [...arr];

  for (let i = 0; i < a.length; i++) {
    let minIndex = i;

    for (let j = i + 1; j < a.length; j++) {
      if (a[j] < a[minIndex]) minIndex = j;
    }

    [a[i], a[minIndex]] = [a[minIndex], a[i]];
  }

  return a;
}

✅ Good for teaching algorithmic thinking
❌ Worse performance than built-in .sort()


✅ Approach 5 — Sorting Using reduce (Functional Programming Trick)

This is not practical but can impress interviewers:

function sortAscending(arr) {
  return arr.reduce((sorted, num) => {
    let i = 0;

    while (i < sorted.length && sorted[i] < num) {
      i++;
    }

    return [...sorted.slice(0, i), num, ...sorted.slice(i)];
  }, []);
}

console.log(sortAscending([5, 2, 9, 1]));
// → [1, 2, 5, 9]

✅ Demonstrates understanding of reduce
✅ Shows mastery of functional thinking
❌ Not efficient (O(n²))


✅ Approach 6 — Sorting Using “Divide and Conquer” (Merge Sort)

Merge sort is a common interview topic.

✅ Code:

function mergeSort(arr) {
  if (arr.length <= 1) return arr;

  const mid = Math.floor(arr.length / 2);
  const left = mergeSort(arr.slice(0, mid));
  const right = mergeSort(arr.slice(mid));

  return merge(left, right);
}

function merge(left, right) {
  const result = [];

  while (left.length && right.length) {
    if (left[0] <= right[0]) result.push(left.shift());
    else result.push(right.shift());
  }

  return [...result, ...left, ...right];
}

console.log(mergeSort([5, 2, 9, 1]));
// → [1, 2, 5, 9]

✅ Efficient sorting algorithm
✅ Time complexity O(n log n)
✅ Stable and predictable


✅ Edge Cases You MUST Handle (Interview Gold)

CaseExampleExpected
Empty array[][]
Single element[5][5]
All equal[3,3,3][3,3,3]
Negative numbers[0,-5,3][-5,0,3]
Decimal numbers[1.2, 0.5, 3.14][0.5,1.2,3.14]
Mixed types[5, "3", 2]Should clarify behavior

If asked how to handle mixed data types, say:

✅ “I’ll filter numbers only”
✅ OR throw validation error


✅ Time Complexity Summary

MethodComplexityNotes
.sort()✅ O(n log n)Engine-optimized
Bubble sort❌ O(n²)Educational only
Selection sort❌ O(n²)Simple but slow
Reduce insertion❌ O(n²)Just for demonstration
Merge sort✅ O(n log n)Algorithmically optimal

✅ Best real-world option: .sort()
✅ Best interview algorithm: Merge Sort or QuickSort explanation


✅ Real-World Use Cases

Sorting arrays is used everywhere:

✅ Sorting leaderboard scores
✅ Sorting product lists by price
✅ Ordering timestamps
✅ Data analysis and data visualization
✅ Preparing sorted backend responses
✅ Machine learning preprocessing
✅ Sorting table rows in UI
✅ Ordering records in databases
✅ File system sorting


✅ Best Practices Summary

✅ Always use a numeric comparator for sorting numbers
✅ Prefer spreading ([...arr]) to avoid mutating input
✅ Know O(n log n) sorting time complexity
✅ Mention “JavaScript uses Timsort internally” (Chrome/Node)
✅ Consider edge cases
✅ Validate input if needed
✅ Know at least one manual sorting algorithm


🔍 SEO Keyword Block (for ranking higher)

  • sort numbers ascending js
  • sort numbers descending js
  • javascript sort numeric array
  • coding challenge sort numbers interview
  • sort numbers without using sort js
  • ascending order function javascript
  • descending order function javascript
  • how to sort array numerically javascript
  • custom comparator javascript
  • array sorting interview question

✅ Final Thoughts

The “Sort numbers in ascending and descending order” problem is a fundamental JavaScript interview coding challenge that tests both your understanding of JavaScript internals and your algorithmic thinking.

A strong candidate not only knows how to write:

arr.sort((a, b) => a - b);

…but also understands:

✅ Why numeric sorting needs a comparator
✅ How sorting algorithms work
✅ How to implement sorting without .sort()
✅ How to reason about time complexity
✅ How to handle edge cases
✅ How sorting is used in real-world applications

Mastering this challenge will significantly improve your performance in JavaScript interviews and strengthen your understanding of array processing at a deep level.


I