# Merge Sort
> A method of merging multiple sorted data sets into one sorted set
*Most efficient method for linked lists!*
### Utilizing Divide and Conquer Algorithm
- Divide data into minimum unit problems, then sort in order to get final results
- `top-down` approach
### Time Complexity
- O(n log n)
### Merge Sort Process
1. Divide Phase
- Continue dividing the entire data set until it becomes minimum-sized subsets
2. Merge Phase
- Sort and merge two subsets into one set
### Divide Process Algorithm
```python
def merge_sort(m):
if len(m) <= 1: # Return immediately if size is 0 or 1
return m
# 1. Divide part
mid = len(m)//2
left = m[:mid]
right = m[mid:]
# Recursively call merge_sort until list size becomes 1
left = merge_sort(left)
right = merge_sort(right)
# 2. Conquer part: Merge divided lists
return merge(left, right)
```
### Merge Process Algorithm
```python
def merge(left, right):
result = [] # Merge two divided lists to create result
while len(left) > 0 and len(right) >0: # When elements remain in both lists
# Compare first elements of two sub lists and add smaller ones to result first
if left[0] <= right[0]:
result.append(left.pop(0))
else:
result.append(right.pop(0))
if len(left) > 0: # When elements remain in left list
result.extend(left)
if len(right) > 0: # When elements remain in right list
result.extend(right)
return result
```