问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PYTHON 归并排序,求排错!

发布网友 发布时间:2022-05-10 08:55

我来回答

2个回答

懂视网 时间:2022-05-10 13:16

这篇文章主要为大家详细介绍了python编程实现归并排序的具体代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

因为上个星期leetcode的一道题(Median of Two Sorted Arrays)所以想仔细了解一下归并排序的实现。

还是先阐述一下排序思路:

首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。这样说起来可能很难理解,于是给出一张我画的图。

这里显示了归并排序的第一步,将数组按照middle进行递归拆分,最后分到最细之后再将其使用对两个有序数组进行排序的方法对其进行排序。

两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后 移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面。

由于递归拆分的时间复杂度是logN 然而,进行两个有序数组排序的方法复杂度是N该算法的时间复杂度是N*logN 所以是NlogN。

根据这波分析,我们可以看看对上图的一个行为。

当最左边的分到最细之后无法再划分左右然后开始进行合并。

第一次组合完成[4, 7]的合并

第二次组合完成[4, 7, 8]的合并

第三次组合完成[3, 5]的合并

第四次组合完成[3, 5, 9]的合并

第五次组合完成[3, 4, 5, 7, 8, 9]的合并结束排序。

下面放上python的代码

def merge(a, b):
 c = []
 h = j = 0
 while j < len(a) and h < len(b):
 if a[j] < b[h]:
 c.append(a[j])
 j += 1
 else:
 c.append(b[h])
 h += 1

 if j == len(a):
 for i in b[h:]:
 c.append(i)
 else:
 for i in a[j:]:
 c.append(i)

 return c


def merge_sort(lists):
 if len(lists) <= 1:
 return lists
 middle = len(lists)/2
 left = merge_sort(lists[:middle])
 right = merge_sort(lists[middle:])
 return merge(left, right)


if name == 'main':
 a = [4, 7, 8, 3, 5, 9]
 print merge_sort(a)

热心网友 时间:2022-05-10 10:24

def merge(left,right): 
    result = [] 
    i,j = 0, 0 
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i]) 
            i = i + 1 
        else:
            result.append(right[j]) 
            j = j + 1
    while (i < len(left)):
        result.append(left[i]) 
        i = i + 1 
    while (j < len(right)):
        result.append(right[j]) 
        j = j + 1 
    return(result)

def mergsort(L):
    print(L)
    if len(L) < 2:
        print(L[:])
        # Missing the following line
        return L
    else:
        middle = len(L)/2
        left = mergsort(L[:int(middle)])
        right = mergsort(L[int(middle):])
        together = merge(left,right)
        print(together)
        return(together)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
结核病是什么样的疾病? 曹丕17岁得了肺痨,明知自己命不长久,还要强争王位,是不是很自私呢?_百... 古代小说常出现的病名 急求一篇"生活小窍门"(500字)的作文 至今最有什么小妙招 健康的戒烟方法 笔记本电池锁死是什么原因引起的? 黑龙江债权转让合同纠纷该怎样取证 安徽债权转让合同纠纷应该怎么样取证 房产官司律师费多少 安逸花三千逾期两年,总是收到被起诉相关的短信,是真的吗? ps图片的水印怎么去掉 急求抽奖软件,用于公司年会用,抽奖人数40即可,要求可以滚动照片的,谢谢!!! 发送到71910108@qq.com vivox5拍照文档娇模式是什么意思 vivo 相机文档矫正 什么技术就业好? 红豆糙米饭的做法步骤图,红豆糙米饭怎么做好吃 在photoshop中图片怎样去除齿轮 报考3+证书需要中专毕业证吗?职业技能证书的等级是要一级(初级)的吗 广东省3+证书高职考需要的技能证书 江西省报考3+证书课程的条件是什么? 考3+证书有什么要求。只有广东可以考3+吗? 梦见自己对着镜子划破了右边的脸! 梦见自己右边脸上满是血,抹都抹不掉,但是没有伤口? 支付宝上交水费没有要交的供水公司咋办? 奔驰是不是有一天会占满26个英文字母?曝奔驰T级车型预告图 2.0T的奔驰G级亮相北京,超140万卖给谁?放心总有人买单 如何从硬盘中划出一部分,修改成物理内存? 流量T和G有哪些不同? 苏联共建造了哪些级别的核潜艇和常规潜艇〔二战后〕 急寻王子变青蛙 经典对白 米克伊尔 阿不拉莫你认识他的电影名字叫什么? 昨天晚上,梦到男朋友出轨了!是和我的一个同学,并且被我捉奸在床,这是什么意思?求解梦 求一部电影,高分悬赏 《我在最美好的年华遇见了你》1972年的意大利电影。最好有中文,没有也行 梦到前男友被我捉奸在床,这是什么意思(这事现实中没发生,不是情景再现) 农业银行鲁通卡过高速的交易怎么查询 1.6化为分数是多少 1点6化成分数是 多少? 1.6等于几分之几? 1.6怎么化成分数 把下面的小数化成最简分数1.6等于多少 1.6表示几个多少分之几,由什么组成 1.6的循环化成分数是多少? 1.6等于几分之几,百分之几,多少成, 1.6用分数表示是多少? ps置入的图片分辨率低 把1.6化成分数再写计数单位可以吗? 把小数改写成分数要约分1.6等于多少? 把下列小数化成分数1.6等于几分之几 把1.6化成分数正确的是多少。