Given an array of three group of elements sort them in order

Input: [2,0,2,1,1,0]

Output: [0,0,1,1,2,2]

One Simple way is to use Counting Sort algorithm

Algorithm:

  1. initialize a bucket(array)
  2. Loop through each element and increment the bucket[i]
  3. Loop through the bucket and update existing nums

Code:

var sortColors = function(nums) {
	let bucket = new Array(3).fill(0);
	for (let i = 0; i < nums.length; i++) {
		bucket[nums[i]]++;
	}
	let bucketIdx = 0;
	for (let i = 0; i < nums.length; i++) {
		console.log(bucketIdx);
		if (bucket[bucketIdx] != 0) {
			nums[i] = bucketIdx;
			bucket[bucketIdx]--;
		} else {
			bucketIdx++;
			i--
		}
	}
	return nums
};

This can also be solved in one pass:

Algorithm:

  1. initialize low and mid to 0 and high to nums last index
  2. Now, consider mid as center pole
  3. Whenever you encounter nums[mid] as 0, swap nums[mid] and nums[low] then increment low and mid. We increment low, so that next 0 will take that index and same with mid
  4. Whenever nums[mid] is 1, just increment mid
  5. Whenever nums[mid] is 2, swap nums[mid] and nums[high] and decrement high. This way we are putting all 2’s at the end
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function (nums) {
  let low = 0, mid = 0, high = nums.length - 1;
  while (mid <= high) {
    if (nums[mid] == 0) {
      let temp = nums[mid];
      nums[mid] = nums[low];
      nums[low] = temp;
      low++;
      mid++;
    } else if (nums[mid] == 1) {
      mid++;
    } else {
      let temp = nums[mid];
      nums[mid] = nums[high];
      nums[high] = temp;
      high--;
    }
  }
};

This post is also available on DEV.