代码环境:python3.6

归并排序采用分治法,思想是:先递归拆分数组,再合并数组。

1、拆分数组

假设数组一共有 n 个元素,我们递归对数组进行折半拆分即n//2,直到每组只有一个元素为止。

2、合并数组

算法会从最小数组开始有序合并,这样合并出来的数组一直是有序的,所以合并两个有序数组是归并算法的核心,这里用两个简单数组示例:

步骤1:新建一个空数组存放合并结果,用l和r两个辅助指针记录两个数组当前操作位置;

步骤2:从左到右逐一比较两个小数组中的元素,较小的元素先放入新数组,指针移位,直到l或r指针超出尾部;

步骤3:指针尚未移到尾部的数组,说明还有剩余元素,将剩余元素合并到新数组尾部。

算法实现

def merge(list_left, list_right):

"""

入参数组都是有序的,此处将两个有序数组合并成一个大的有序数组

"""

# 两个数组的起始下标

l, r = 0, 0

new_list = []

while l < len(list_left) and r < len(list_right):

if list_left[l] < list_right[r]:

new_list.append(list_left[l])

l += 1

else:

new_list.append(list_right[r])

r += 1

new_list += list_left[l:]

new_list += list_right[r:]

return new_list

def merge_sort(mylist):

"""归并排序

mylist: 待排序数组

return: 新数组list

"""

if len(mylist) <= 1:

return mylist

mid = len(mylist) // 2

list_left = merge_sort(mylist[:mid])

list_right = merge_sort(mylist[mid:])

return merge(list_left, list_right)

if __name__ == "__main__":

mylist = [12, 33, 199, 0, 54, 33, 11]

result = merge_sort(mylist)

print(f'归并排序后:{result}')

算法效率

时间复杂度:O(nlogn)

归并排序把数组一层层折半分组,长度为 n 的数组,折半层数就是 logn,每一层进行操作的运算量是 n,得出时间复杂度 O(nlogn)。

空间复杂度:O(n)

每次归并操作需要创建额外的新数组,占用空间为 n,但这部分额外空间会随着方法的结束而释放,所以只需要算单次归并操作开辟的空间即可,得出空间复杂度 O(n)。

稳定性:稳定

从算法中从左到右逐一比较,较小的先放入新数组,所以两个值相同的元素,排序后依然保持原先后顺序。

非原地排序

python归并排序 分词_python-归并排序相关推荐

  1. python 中文分词_python中文分词,使用结巴分词对python进行分词(实例讲解)

    在采集 中文分词是中文文本处理的一个基础性工作,结巴分词利用进行中文分词. 其基本实现原理有三点: 1.基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) ...

  2. python归并排序 分词_python实现归并排序,归并排序的详细分析

    学习归并排序的过程是十分痛苦的.它并不常用,看起来时间复杂度好像是几种排序中最低的,比快排的时间复杂度还要低,但是它的执行速度不是最快的. 很多朋友不理解时间复杂度低为什么运行速度不一定快,这个不清楚 ...

  3. python递归排序_Python归并排序(递归实现)

    为什么归并排序如此有用? 1. 快捷和稳定 归并排序成为⼀一个非常棒的排序算法主要是因为它的快捷和稳 定.它的复杂度即使在最差情况下都是O(n log n).而快速排序 在最差情况下的复杂度是O(n^ ...

  4. python最大分词_python正向最大匹配分词和逆向最大匹配分词的实例

    正向最大匹配 # -*- coding:utf-8 -*- CODEC='utf-8' def u(s, encoding): 'converted other encoding to unicode ...

  5. python 英语分词_Python英文文本分词(无空格)模块wordninja的使用实例

    在NLP中,数据清洗与分词往往是很多工作开始的第一步,大多数工作中只有中文语料数据需要进行分词,现有的分词工具也已经有了很多了,这里就不再多介绍了.英文语料由于其本身存在空格符所以无需跟中文语料同样处 ...

  6. python统计词频_Python中文分词及词频统计

    中文分词 中文分词(Chinese Word Segmentation),将中文语句切割成单独的词组.英文使用空格来分开每个单词的,而中文单独一个汉字跟词有时候完全不是同个含义,因此,中文分词相比英文 ...

  7. python jieba库分词_Python基于jieba库进行简单分词及词云功能实现方法

    本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法.分享给大家供大家参考,具体如下: 目标: 1.导入一个文本文件 2.使用jieba对文本进行分词 3.使用wordcloud包 ...

  8. python结巴分词实例_python 结巴分词(jieba)详解

    "结巴"中文分词:做最好的 Python 中文分词组件 "Jieba" (Chinese for "to stutter") Chinese ...

  9. python归并算法_python归并算法

    python数据结构与算法总结 python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: <数据结构和算法对python意味着什么?> <顺序表数据结构 ...

  10. python 两点曲线_Python已经成为排名第一的编程语言!附带最新Python400集视频教学...

    同样是学习编程语言,当然要选择目前业内最先进.最热门.将来应用最广泛.最有前景的编程语言.在2017年的编程语言排行榜中,Python排名第一. Python拥有海量的开发库,方便控制各种品牌硬件,快 ...

最新文章

  1. LeetCode 3Sum
  2. 最后9个名额丨知识图谱理论与实战(线下集训)
  3. response细节点
  4. [Luogu1890]gcd区间
  5. JTable 失去焦点时取消编辑状态
  6. android arcgis 绘制圆_arcgis for android 定位 圆
  7. 火狐浏览器如何设置启动页面
  8. NBU调用crontab备份
  9. Java 集合 源码分析+重点解析 超详细学习资料
  10. c语言日志管理系统 --- zlog
  11. 笔试题目:升级装备题
  12. 机械制图计算机类实验报告,机械cad实验报告总结
  13. 多媒体信息发布系统源码
  14. ai面试的优缺点_淘汰你的不一定是HR,有可能是AI面试官
  15. 北航超算运行matlab,北航荣获世界大学生超算总决赛一等奖!超50万亿次,又破世界纪录...
  16. 有向图和无向图用邻接矩阵储存
  17. Eclipse的各种查找,类的查找,方法查找快捷键
  18. H5页面手机端禁止缩放的正确方式
  19. 动态规划:走楼梯问题——01
  20. MySQL教程——2 中级篇(索引、视图、存储过程)

热门文章

  1. 在WildFly中运行多个standalone模式的实例
  2. 简谈WP,IOS,Android智能手机OS
  3. PGA内存作用和构成
  4. *36.操作系统中磁盘的调度算法
  5. 常用对照表之TCP及UDP常见端口参照
  6. 计算机视觉开源库OpenCV之照明和色彩空间
  7. 大众26亿美元投资自动驾驶公司,可这行人才还在继续流失
  8. 我国近四成程序员单身 盘点各国IT从业者生存现状
  9. 遇到问题为何该自己动手
  10. 麟龙指标通达信指标公式源码_通达信指标公式源码神龙指标公式