归并排序是一种稳定的排序,其时间复杂度是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