关于极客网中两个排序数组中位数问题的解答(Python实现)

本文介绍了一种解决极客网上的算法问题的方法,涉及将两个已排序数组合并并找到中位数。首先通过合并和排序数组来找到中位数,然后优化算法,减少遍历次数,通过比较数组长度和元素大小决定如何合并,以降低复杂度。
摘要由CSDN通过智能技术生成

在极客网上看到了这个算法题感觉很有意思,这里我们主要是实现该问题的解答,具体题目中的算法复杂度要求我没有做太多考虑,一开始我设计了一个很简单的程序去实现这个题目。具体题目内容如下图。
这里写图片描述
1:首先看到这个算法题,我的思路是先将两个列表合并成一个列表(Python中是列表和C语言中的数组组很相似),然后我们将合并后的列表进行排序,这样我们只用根据下标来得到我们最终想要的结果。

def middle(list1,list2):
    list3 = []                 #定义一个空列表
    for i in list1:            #遍历列表1
        list3.append(i)
    for j in list2:            #遍历列表2
        list3.append(j)
    list3.sort()               #通过内置函数将列表3内函数排序
    length = len(list1)+len(lsit2)
    if length%2 == 1:
        return float(list3[length//2])
    elif length%2 == 0:
        return (list3[length//2]+list3[(length//2)-1])/2

这个程序中,我们利用了Python中很多优秀的内置函数,在程序的最后部分,我们为了得到想要的结果,我们利用了下标来寻找我们的中位数,当排序后的列表(list3)长度是一个奇数的时候,我们的中位数就是列表(list3)中的一个确定的数,我们只要取得中间那一个下标所对应的值就OK;当我们的排序后的列表(list3)的长度是偶数的时候,我们需要计算出列表(list3)中间两位数的平均值,这样就行了。
这个程序可以实现我们想要的效果,但是程序中需要遍历两次列表,这样程序的算法复杂度就比较高了,所以我们需要改进我们的程序。

  • 我们先假设两个列表中,列表(list1)比列表(list2)长,那么我们可以知道中位数的下标值(length//2,其中length表示列表1和列表2的长度之和)肯定比列表(list1)的长度小。
  • 这样我们就可以利用列表(list1)的下标来获取中位数的值,但是在这之前还有一步操作
  • 我们需要将列表(list2)中所有小于列表(list1)中最后一个元素的所有项添加到列表(list1)中去,这样我们就不要管列表(list2)中那些比列表(list1)所有项都大的元素了。
#判断两个列表关系以及后续操作的函数
def middle(l1, l2):
    length = len(l1) + len(l2)
    if len(l1) > len(l2):
        result = appendpart(l1, l2, length)
        return result
    elif len(l1) < len(l2):
        result = appendpart(l2, l1, length)
        return result
    elif len(l1) == len(l2):
        if l1[len(l1) - 1] <= l2[len(l2)-1]:
            result = appendpart(l2, l1, length)
            return result
        elif l2[len(l2) - 1] < l1[len(l1)-1]:
            result = appendpart(l1, l2, length)
            return result

#列表添加以及求中位数的函数
def appendpart(list1, list2, length):
    for i in list2:
        if i <= list1[len(list1) - 1]:  #将list2中所有小于list1中最后一项的元素添加到lsit1中
            list1.insert(0,i)
    list1.sort()
    if length % 2 == 1:                 #通过判断列表长度的奇偶来确定中位数的下标
        return float(list1[length // 2])
    else:
        return (list1[length // 2] + list1[(length // 2) - 1]) / 2

这是完整的代码,但是这里有一个情况还需要考虑一下,那就是当两个列表的长度的相等的时候,我们需要判断哪一个列表中的元素更大一些,这样我们才可以确定将哪个列表添加到另一个列表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值