Merge Sort#
Merge sort is an efficient sorting algorithm. It was invented by John von Neumann in 1945.
Algorithm#
Algorithm 1 (Merge)
Inputs: sorted array \(A\), sorted array \(B\) Output: sorted array \(C\)
\(i \leftarrow 1\)
\(j \leftarrow 1\)
\(C \leftarrow []\)
While \(i \leq \text{length}(A)\) and \(j \leq \text{length}(B)\):
If \(A[i] < B[j]\):
Append \(A[i]\) to \(C\)
\(i \leftarrow i + 1\)
Else:
Append \(B[j]\) to \(C\)
\(j \leftarrow j + 1\)
While \(i \leq \text{length}(A)\):
Append \(A[i]\) to \(C\)
\(i \leftarrow i + 1\)
While \(j \leq \text{length}(B)\):
Append \(B[j]\) to \(C\)
\(j \leftarrow j + 1\)
Return \(C\)
Algorithm 2 (Merge Sort)
Inputs: array \(A\) Output: sorted array \(A\)
\(n \leftarrow \text{length}(A)\)
If \(n = 1\):
Return \(A\)
Else:
\(m \leftarrow n / 2\)
\(L \leftarrow A[1:m]\)
\(R \leftarrow A[m+1:n]\)
\(L \leftarrow \text{MergeSort}(L)\)
\(R \leftarrow \text{MergeSort}(R)\)
\(A \leftarrow \text{Merge}(L, R)\)
Return \(A\)
Implementation#
def merge(left, right):
"""
Merge two sorted arrays into one sorted array.
Parameters
----------
left : list
The first sorted array
right : list
The second sorted array
Returns
-------
list
The merged sorted array
"""
merged = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
merged.append(left[i])
i += 1
else:
merged.append(right[j])
j += 1
merged.extend(left[i:])
merged.extend(right[j:])
return merged
def merge_sort(arr):
"""
Merge sort algorithm.
Parameters
----------
arr : list
The array to be sorted
Returns
-------
list
The sorted array
"""
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
if __name__ == "__main__":
# Example usage
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print("Sorted array:", sorted_arr)
# Output: Sorted array: [3, 9, 10, 27, 38, 43, 82]