Guided Project: Sorting II

Learn to implement and apply advanced sorting algorithms: Merge Sort and Quick Sort.

Merge Sort

Example Implementation

function mergeSort(arr) { // Base case: arrays with 0 or 1 element are already sorted if (arr.length <= 1) { return arr; } // Split array into two halves const mid = Math.floor(arr.length / 2); const left = arr.slice(0, mid); const right = arr.slice(mid); // Recursively sort both halves return merge(mergeSort(left), mergeSort(right)); } function merge(left, right) { const result = []; let leftIndex = 0; let rightIndex = 0; // Compare elements from both arrays and merge them in sorted order while (leftIndex < left.length && rightIndex < right.length) { if (left[leftIndex] < right[rightIndex]) { result.push(left[leftIndex]); leftIndex++; } else { result.push(right[rightIndex]); rightIndex++; } } // Add remaining elements (if any) return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex)); }

Time & Space Complexity:

  • Time Complexity: O(n log n) - Consistent performance for all input cases
  • Space Complexity: O(n) - Requires additional space for the merged arrays

Example Usage:

const numbers = [38, 27, 43, 3, 9, 82, 10]; console.log(mergeSort(numbers)); // [3, 9, 10, 27, 38, 43, 82]

Quick Sort

Example Implementation

function quickSort(arr, left = 0, right = arr.length - 1) { if (left < right) { // Partition array and get pivot index const pivotIndex = partition(arr, left, right); // Recursively sort elements before and after pivot quickSort(arr, left, pivotIndex - 1); quickSort(arr, pivotIndex + 1, right); } return arr; } function partition(arr, left, right) { // Choose the rightmost element as the pivot const pivot = arr[right]; let i = left - 1; // Move all elements smaller than pivot to the left for (let j = left; j < right; j++) { if (arr[j] <= pivot) { i++; [arr[i], arr[j]] = [arr[j], arr[i]]; // Swap elements } } // Place pivot in its correct position [arr[i + 1], arr[right]] = [arr[right], arr[i + 1]]; return i + 1; // Return pivot index }

Time & Space Complexity:

  • Time Complexity: Average Case: O(n log n), Worst Case: O(n²) if poorly partitioned
  • Space Complexity: O(log n) - Due to the recursion stack

Example Usage:

const numbers = [10, 7, 8, 9, 1, 5]; console.log(quickSort(numbers)); // [1, 5, 7, 8, 9, 10]

Algorithm Comparison

Characteristic Merge Sort Quick Sort
Approach Divide and conquer, merges sorted sublists Divide and conquer, uses pivot to partition
Time Complexity O(n log n) - consistent Average: O(n log n), Worst: O(n²)
Space Complexity O(n) - requires extra space O(log n) - in-place partitioning
Stability Stable (preserves order of equal elements) Unstable (may change order of equal elements)
Best Use Cases External sorting, linked lists, stability required Internal sorting, arrays, memory constraints

Practice Problems

Test your understanding with these LeetCode problems: