1、归并排序思想

归并排序的核心思想:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。

归并排序的执行效率与要排序的原始数组的有序程度无关,所以其时间复杂度是非常稳定的,不管是最好情况、最坏情况,还是平均情况,时间复杂度都是 O(nlogn)。空间复杂度是 O(n)。

2、代码详解(合并函数merge())


'''归并排序算法,a是int型列表'''
def merge_sort(a):_merge_sort_between(a, 0, len(a) - 1)'''递归调用函数'''
def _merge_sort_between(a, low, high):if low < high:  # 必要,特殊情况排查mid = low + (high - low)//2_merge_sort_between(a, low, mid)_merge_sort_between(a, mid+1, high)if a[mid] > a[mid+1]:  # 时间优化:当前部分<=后部分时,则不需用进行merge操作_merge(a, low, mid, high)def _merge(a, low, mid, high):# a[low...mid], a[mid+1...high] are sorted.# 游标i , j 分别指向 a[low...mid], a[mid+1...high] 的第一个元素i, j = low, mid + 1tmp = [] # 临时数组while i <= mid and j <= high:if a[i] <= a[j]:tmp.append(a[i])i += 1else:tmp.append(a[j])j += 1# 循环结束时,会有一个子数组有剩余的数据# if i <= mid ,说明前半个子数组有剩余的数据,start = i ,否则start = jstart = i if i <= mid else jend = mid if i <= mid else high# 将剩余的数据添加到 tmp 中tmp.extend(a[start:end + 1])# 将 tmp 中的数组拷贝回 a[low...high]a[low:high + 1] = tmpif __name__ == "__main__":a1 = [3, 5, 6, 7, 8]a2 = [2, 2, 2, 2]a3 = [4, 3, 2, 1]a4 = [5, -1, 9, 3, 7, 8, 3, -2, 9]merge_sort(a1)print(a1)merge_sort(a2)print(a2)merge_sort(a3)print(a3)merge_sort(a4)print(a4)

3、归并与快排的区别

归并排序和快速排序是两种稍微复杂的排序算法,它们用的都是分治的思想,代码都通过递归来实现,过程非常相似。理解归并排序的重点是理解递推公式和 merge() 合并函数。同理,理解快排的重点也是理解递推公式,还有 partition() 分区函数。

归并排序算法是一种在任何情况下时间复杂度都比较稳定的排序算法,这也使它存在致命的缺点,即归并排序不是原地排序算法,空间复杂度比较高,是 O(n)。正因为此,它也没有快排应用广泛

快速排序算法虽然最坏情况下的时间复杂度是 O(n^2),但是平均情况下时间复杂度都是 O(nlogn)。不仅如此,快速排序算法时间复杂度退化到 O(n^2) 的概率非常小,我们可以通过合理地选择 pivot 来避免这种情

上图可见,归并排序的处理过程是由下到上的,先处理子问题,然后再合并

而快排正好相反,它的处理过程是由上到下的,先分区,然后再处理子问题。

归并排序虽然是稳定的、时间复杂度为 O(nlogn) 的排序算法,但是它是非原地排序算法。我们前面讲过,归并之所以是非原地排序算法,主要原因是合并函数无法在原地执行。快速排序通过设计巧妙的原地分区函数,可以实现原地排序,解决了归并排序占用太多内存的问题。

归并排序(Python)相关推荐

  1. 归并排序python实现

    归并排序python实现 归并排序 归并排序在于把序列拆分再合并起来,使用分治法来实现,这就意味这要构造递归算法 首先是一个例子 原序先通过一半一半的拆分,然后: 然后再一步一步的向上合并,在合并的过 ...

  2. 二路归并排序Python实现-III

    二路归并排序Python实现-III 归并排序 是一种 效率比较高并且稳定的算法.时间复杂度 O(NLog(N)),空间复杂度 O(N). 归并排序(Merge Sort)是建立在归并操作上的一种有效 ...

  3. 归并排序Python代码

    归并排序是面试最常考内容, 让你描述算法, 让你写算法, 让你分析时间复杂度 归并排序merge sort思路: 归并排序中间劈一刀,数组分两半,两边排好序,最后把左右两个合并.就是先局部有序,再整体 ...

  4. 算法--分治法归并排序 python

    设计算法 我们可以选择使用的算法设计方法有很多,插入排序使用了增量方法:在排序子数组A[1-j-1]后,将单个元素A[ j ]插入子数组的适当位置,产生排序好的子数组A[1-j]. 而这次我们将考查另 ...

  5. 二路归并排序——python

    from __future__ import print_functiondef merge_sort(collection):"""二路归并排序(稳定排序),结果升序算 ...

  6. 归并排序-python

    归并排序 归并排序是采用分治法的一个非常典型的应用.归并排序的思想就是先递归分解数组,再合并数组. 将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相 ...

  7. 归并排序(Python代码)

    1.归排序 归并排序用的是分治法,把一个大问题化解为k个中问题,每个中问题再化解为k个小问题,直至问题化为最小可解的问题.对这些问题求解,再不断地合并结果,直至合并完毕. 如下图: 注意: 合并方法, ...

  8. 快速排序和归并排序的区别,Python代码实现

    排序理念比较: 归并排序merge sort思路: 归并排序中间劈一刀,两边再排序,然后把左右两个合并.就是先局部有序,再整体有序. 快速排序思路: 随便选择一个数字作为中间点,小于放在左边,大于放在 ...

  9. python归并排序_python归并排序

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python写归并排序 开始今天内容之前,先给大家推荐一款审核利器,goince ...

  10. python算法系列资料集(一)-2022.03.15

    小学生学python(一) 小学生学python(一) - 超龄码农 - 博客园 小学生学python(二) 小学生学python(二) - 超龄码农 - 博客园 小学生学python(三) 小学生学 ...

最新文章

  1. JNI中java类型的简写
  2. Java基础小常识-继承-(10)
  3. python一些常用函数_【python】常用的一些内置函数
  4. jinjia2 模板不解析html
  5. [PyJs系列介绍]三、编译与上线
  6. 基于ForkJoin构建一个简单易用的并发组件
  7. 冒泡排序(Bubble Sort)详解与代码
  8. Exploit-exercises
  9. 日常工作常用的几款小工具
  10. 程序员相亲被大三岁的富婆姐姐看上,让他当《杭州赘婿》
  11. 【协议】MQTT、CoAP、HTTP比较,MQTT协议优缺点
  12. idea软件界面的的外观设置-----一般都有三套主题:IntelliJ Light ,Darcula,Windows供选择
  13. lua生成指定大小的随机字符串
  14. 旋转木马 css,CSS:3D旋转木马效果
  15. 晨枫U盘维护工具V2.0 安装教程
  16. c语言编码数字的范围,C语言数据类型的表示范围
  17. php+源码加密思想,PHP源码加密方法
  18. Apache2.2(OS 64)指定的网络名不再可用的处理
  19. 昆明公交车和站台建在路中央
  20. 项目经理:我是如何进行项目进度管理的

热门文章

  1. 离线数仓建设及技术选型
  2. win10推送_Win10新版19631推送,网友:千万别翻车
  3. MySQL中获取当前时间与时间戳
  4. MAC双系统U盘安装方法
  5. 账龄分析表excel模板_电商数据分析统计模板工作表
  6. 云系列--- Openstack Placement组件 | 参数说明 | 详细讲解
  7. 常用的数据类型有哪些?简单数据类型与复杂数据类型之间的区别?
  8. 简单数据类型、复杂数据类型
  9. windows 命令行查找字符串 和 文件(find findstr for)
  10. python斐波拉契数列(Fibonacci)