Skip to content

Instantly share code, notes, and snippets.

@potatowagon
Created July 25, 2021 17:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save potatowagon/4924a956ccd29b60b7cd51ed45159d89 to your computer and use it in GitHub Desktop.
Save potatowagon/4924a956ccd29b60b7cd51ed45159d89 to your computer and use it in GitHub Desktop.

Code

Array not inplace

better done with linked list

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        def merge_sort(nums_list, start, end):
            if (start == end):
                return [nums_list[start]]
            mid = ((end + 1 - start) // 2) + start
            left = merge_sort(nums_list, start, mid-1)
            right = merge_sort(nums_list, mid, end)
            
            # merge, compare left and right
            ans = []
            while left and right:
                ans.append(left.pop(0)) if left[0] <= right[0] else ans.append(right.pop(0))
            
            # add leftovers that are already sorted
            ans.extend(left)
            ans.extend(right)
            return ans
            
        return merge_sort(nums, 0, len(nums)-1)

Array in place

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        def shift_right(nums_list, start, end):
            while end > start:
                nums_list[end] = nums_list[end-1]
                end -=1
            return nums_list
            
        def merge_sort(nums_list, start, end):
            if (start >= end):
                return start, end
            mid = ((end + 1 - start) // 2) + start
            left_s, left_e = merge_sort(nums_list, start, mid-1)
            right_s, right_e = merge_sort(nums_list, mid, end)
            
            # merge, compare left and right, if right smaller then left insert before start of left, the sorted portion.
            os = left_s
            while left_s <= left_e and right_s <= right_e:
                if nums_list[right_s] < nums_list[left_s]:
                    tmp = nums_list[right_s]
                    nums_list = shift_right(nums_list, left_s, right_s)
                    nums_list[left_s] = tmp
                    left_s += 1
                    left_e += 1
                    right_s += 1
                else:
                    left_s += 1
            return os, right_e
            
        merge_sort(nums, 0, len(nums)-1)
        return nums
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment