归并排序1

2024-05-22

归并排序1

使用哨兵数inf来避免每一次循环步骤中都要出现数组是否结束的判断

```python import math

A1 = [2, 3, 2, 9, 4, 5, 1, 3, 2, 7, 6, 4, 13, 134, 1211]#定义待排序的一维数组
A = [A1[i:i+2] for i in range(0, len(A1), 2)]#将其每两个就分开
for i in range(len(A)):#用大小比较排序每个2元子数组
    if len(A[i]) == 1:
        pass
    elif len(A[i]) == 2:
        if A[i][0] > A[i][1]:
            A[i][0], A[i][1] = A[i][1], A[i][0]

def merge(L, R):
    res = []
    n1 = len(L)
    n2 = len(R)
    L.extend([math.inf])#使用extend而非append,避免多次调用append影响性能
    R.extend([math.inf])
    i, j = 0, 0
    for k in range(n1 + n2):
        if L[i] <= R[j]:
            res.append(L[i])
            i += 1
        else:
            res.append(R[j])
            j += 1
    return res

while i != 1:
    i = len(A) - 1
    a = merge(A[i], A[i - 1])#确保在切除前merge最后两个数组元素
    A = A[:-2]# 使用切片去除最后两个元素
    A.append(a)

print('after sort:', A[0])#由于A处理到最后,是一个只有一个元素的数组,所以直接输出A[0]即可

该排序方法的时间复杂度为 O(n * log_2(n))。根据书中思路自编,还需后续学习改进。