MergeSort

Code:

class MergeSort():
    def sort(self, arr):
        if len(arr) <= 1:
            return arr

        mid = len(arr) / 2
        arr_left = self.sort(arr[:mid])
        arr_right = self.sort(arr[mid:])

        i, j, k = 0, 0, 0
        while i < len(arr_left) and j < len(arr_right):
            if arr_left[i] < arr_right[j]:
                arr[k] = arr_left[i]
                i += 1
            else:
                arr[k] = arr_right[j]
                j += 1

            k += 1

        while i < len(arr_left):
            arr[k] = arr_left[i]
            i += 1
            k += 1

        while j < len(arr_right):
            arr[k] = arr_right[j]
            j += 1
            k += 1

        return arr

if __name__ == "__main__":
    print MergeSort().sort([3, 4, 5, 2, 1])

 

Idea:

Divide and Conquer.

Assume the list length is N. The time complexity is O(NlogN) and space complexity is O(N+logN) = O(N). In the space complexity, O(logN) is the stack size when you recursively call self.sort. O(N) is the size of the new two arrays arr_left and arr_right.

If the list is linked list, merge sort has the same time complexity O(NlogN) and but space complexity is only O(logN), which is purely the stack size. See: http://stackoverflow.com/questions/24171242/why-is-mergesort-space-complexity-ologn-with-linked-lists

Leave a comment

Your email address will not be published. Required fields are marked *