DEV Community

Discussion on: Merge Sort in Ruby

Collapse
 
mdegoys profile image
Matthieu • Edited

Hi Megan,
thanks for sharing this article, this is great work.

I'm not sure if it's more readable, but I think you can merge (no pun intended :)) the three while as they look a lot similar in your merge method. I tried the following refactor and it seems to work:

def merge_sort(array)
  if array.length <= 1
    return array
  end

  array_size = array.length
  middle = (array.length / 2).round

  left_side = array[0...middle]
  right_side = array[middle...array_size]

  sorted_left = merge_sort(left_side)
  sorted_right = merge_sort(right_side)

  merge(array, sorted_left, sorted_right)

  return array
end

def merge(array, sorted_left, sorted_right)
  left_size = sorted_left.length
  right_size = sorted_right.length

  array_pointer = 0
  left_pointer = 0
  right_pointer = 0

  while array_pointer < left_size + right_size
    if (left_pointer < left_size) && (right_pointer == right_size - 1 || sorted_left[left_pointer] < sorted_right[right_pointer])
      array[array_pointer] = sorted_left[left_pointer]
      left_pointer += 1
    else
      array[array_pointer] = sorted_right[right_pointer]
      right_pointer += 1
    end
    array_pointer += 1
  end

  return array
end
Enter fullscreen mode Exit fullscreen mode
Collapse
 
mwong068 profile image
Megan • Edited

I love it! Thanks a bunch for that Matthieu!

And I appreciate you following along with the series as well. 😊