Given an array of integers, sort the elements in the array in ascending order. The merge sort algorithm should be used to solve this problem.

Examples

  • {1} is sorted to {1}
  • {1, 2, 3} is sorted to {1, 2, 3}
  • {3, 2, 1} is sorted to {1, 2, 3}
  • {4, 2, -3, 6, 1} is sorted to {-3, 1, 2, 4, 6}

Corner Cases

  • What if the given array is null? In this case, we do not need to do anything.
  • What if the given array is of length zero? In this case, we do not need to do anything.

Time Complexity: O(NlogN)

Space Complexity: O(N) 

class Solution(object):
  def mergeSort(self, array):
    """
    input: int[] array
    return: int[]
    """
    # write your solution here
    if array is None or len(array) <= 1:
      return array
    cp_lst = array.copy()
    self.helper(0, len(array) - 1, array, cp_lst)
    return array

  def helper(self, left, right, array, cp_lst):
    if left >= right:
      return
    mid = left + (right - left) // 2
    self.helper(left, mid, array, cp_lst)
    self.helper(mid + 1, right, array, cp_lst)
    self.merge(left, right, mid, array, cp_lst)

  def merge(self, left, right, mid, array, cp_lst):
    for i in range(left, right + 1):
      cp_lst[i] = array[i]
    left_idx = left
    right_idx = mid + 1
    index = left_idx
    while left_idx <= mid and right_idx <= right:
      if cp_lst[left_idx] <= cp_lst[right_idx]:
        array[index] = cp_lst[left_idx]
        left_idx += 1
      else:
        array[index] = cp_lst[right_idx]
        right_idx += 1
      index += 1
    while left_idx <= mid:
      array[index] = cp_lst[left_idx]
      index += 1
      left_idx += 1
02-12 04:48