python排序算法——归并排序算法快速掌握上手(持续更新)

归并排序是一种稳定的排序,其时间复杂度是O(nlogn)

归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经归并序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

例题:

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

代码: 

m=list(map(int,input().split(',')))
n=list(map(int,input().split(',')))
def merge(li,low,mid,hight):#排序
    l=[]
    i=low
    mid=(low+hight)//2#设置中位数
    j=mid+1
    ltmp=[]
    while i<=mid and j<=hight:#当超出(low小于中,且mid+1小于高)结束
        if li[i]<=li[j]:#谁小谁进,指针加1
            ltmp.append(li[i])
            i+=1
        else:
            ltmp.append(li[j])
            j+=1
    while i<=mid:#剩余部分直接加入
        ltmp.append(li[i])
        i+=1
    while j<=hight:
        ltmp.append(li[j])
        j+=1
    li[low:hight+1]=ltmp
def merge_sort(li,low,hight):#整体递归完成排序
    if low<hight:
        mid=(low+hight)//2
        merge_sort(li,low,mid)
        merge_sort(li,mid+1,hight)
        merge(li,low,mid,hight)

k=m+n
j=len(k)
merge_sort(k,0,j-1)
if j%2==0:#中位数的两种情况
    print((k[j//2-1]+k[j//2])/2)
else:
    print(int(k[j//2]))

输入:

2,3,4
6,4,3

输出:

3.5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hares_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值