算法与数据结构:归并排序(python实现)

本文深入讲解了归并排序算法的工作原理,通过实例演示了如何将一组数字通过递归分割成单个元素,再逐步合并成有序序列的过程。文章提供了详细的代码实现,并探讨了优化策略,如在特定条件下提前终止合并过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序

用下边例子来

 

level 0   8 6 2 3 1 5 7 4

leve 1    8 6 2 3           1 5 7 4

leve 2    8 6     2 3           1 5     7 4

leve 3    8    6    2    3          1     5    7    4

先将这组数分组,每次在中间分开,知道分成单个数位为止,然后归并。

从第三层为第二层归并

leve 2    6 8      2 3          1 5       4 7     这样就分出来四个有序的序列

再到leve1 层

leve 1    2 3 6 8         1 4 5 7     形成两个有序的序列

再到leve0

leve0 1 2 3 4 5 6 7 8

就得出了想要的结果。

图解:

 

代码:

a=[8, 2, 6, 3, 7, 2, 8, 5, 5, 5, 3, 8, 3, 4, 4]
def merge(arr, l, mid, r):
    aux=[]
    for c in range(l,r+1):
        aux.append(arr[c])
    i=l
    j=mid+1
    for k in range(l,r+1):
        if i > mid:
            arr[k] = aux[j - l]
            j+=1
        elif j > r:
            arr[k] = aux[i - l]
            i+= 1
        elif aux[i-l] <= aux[j-l]:
            arr[k]=aux[i-l]
            i+=1
        else:
            arr[k] = aux[j-l]
            j+=1
    return arr
def mergeSort1(arr,l,r):
    if  l>=r:
        return None
    mid = (l+r)/2
    mergeSort1(arr, l, mid)
    mergeSort1(arr, mid+1, r)
    merge(arr, l, mid, r)
    return arr
def mergeSort(arr):
    arr=mergeSort1(arr,0,len(arr)-1)
    return arr
print mergeSort(a)

其中mege可以修改为下边

def merge(arr,l,mid,r):
    ar=[]
    lt=l
    rt=mid+1
    while lt <= mid and rt <= r:
       if arr[lt] < arr[rt]:
           ar.append(arr[lt])
           lt+=1
       else:
           ar.append(arr[rt])
           rt+=1
    if  rt <= r:
        ar.extend(arr[rt:r+1])
    if lt <= mid:
        ar.extend(arr[lt:mid + 1])
    arr[l:r+1]=ar
    return arr

不再原地修改,直接将新生成的空间返回:

def merge(left,right):
    ar=[]
    mid =len(left)-1
    r = len(right)-1
    lt=0
    rt=0
    while lt <= mid and rt <= r:
       if left[lt] < right[rt]:
           ar.append(left[lt])
           lt+=1
       else:
           ar.append(right[rt])
           rt+=1
    if  rt <= r:
        ar.extend(right[rt:r+1])
    if lt <= mid:
        ar.extend(left[lt:mid + 1])
    return ar
def mergeSort(arr):
    l=0
    r=len(arr)-1
    if l >=r:
        return arr
    mid = (r+l)//2
    left = mergeSort(arr[l:mid+1])
    right = mergeSort(arr[mid+1:r+1])
    arr = merge(left,right)
    return arr
a=[1,3,5,3,6,7,8]

print(mergeSort(a))

归并排序当右边的第一个元素大于左边的最后一个元素,可以直接合并,提前中止,修改代码如下:

def merge(left,right):
    ar=[]
    mid =len(left)-1
    r = len(right)-1
    lt=0
    rt=0
    while lt <= mid and rt <= r and left[mid] > right[rt]:
       if left[lt] < right[rt]:
           ar.append(left[lt])
           lt+=1
       else:
           ar.append(right[rt])
           rt+=1

    if lt <= mid:
        ar.extend(left[lt:mid + 1])
    if rt <= r:
        ar.extend(right[rt:r + 1])
    return ar

参考文献:

1、慕课https://coding.imooc.com/class/71.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值