51 lines
1.1 KiB
Python
51 lines
1.1 KiB
Python
|
|
"""
|
||
|
|
归并排序 — 分治法的经典应用
|
||
|
|
时间复杂度 O(n log n),空间复杂度 O(n)
|
||
|
|
"""
|
||
|
|
|
||
|
|
def merge(arr, left, mid, right):
|
||
|
|
"""合并两个有序子数组"""
|
||
|
|
# 创建临时数组
|
||
|
|
L = arr[left:mid + 1]
|
||
|
|
R = arr[mid + 1:right + 1]
|
||
|
|
|
||
|
|
i = j = 0
|
||
|
|
k = left
|
||
|
|
|
||
|
|
# 合并两个有序数组
|
||
|
|
while i < len(L) and j < len(R):
|
||
|
|
if L[i] <= R[j]:
|
||
|
|
arr[k] = L[i]
|
||
|
|
i += 1
|
||
|
|
else:
|
||
|
|
arr[k] = R[j]
|
||
|
|
j += 1
|
||
|
|
k += 1
|
||
|
|
|
||
|
|
# 复制剩余元素
|
||
|
|
while i < len(L):
|
||
|
|
arr[k] = L[i]
|
||
|
|
i += 1
|
||
|
|
k += 1
|
||
|
|
while j < len(R):
|
||
|
|
arr[k] = R[j]
|
||
|
|
j += 1
|
||
|
|
k += 1
|
||
|
|
|
||
|
|
def merge_sort(arr, left, right):
|
||
|
|
"""归并排序主函数"""
|
||
|
|
if left < right:
|
||
|
|
mid = (left + right) // 2
|
||
|
|
merge_sort(arr, left, mid)
|
||
|
|
merge_sort(arr, mid + 1, right)
|
||
|
|
merge(arr, left, mid, right)
|
||
|
|
|
||
|
|
def sort(arr):
|
||
|
|
merge_sort(arr, 0, len(arr) - 1)
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
data = [38, 27, 43, 3, 9, 82, 10]
|
||
|
|
print("排序前:", data)
|
||
|
|
sort(data)
|
||
|
|
print("排序后:", data)
|