一、归并排序

-归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分合策略(将问题分(divide)成一些小的问题然后递归求解,而合的阶段则将分的阶段得到的各答案"修补"在一起,分久必合)。

 

1.2 一次归并

- 一次归并
![](https://img2018.cnblogs.com/blog/1226829/201809/1226829-20180924192146754-191792692.png)

如图按照图中的一组数组被分成两半,蓝色和红色都是分别排好序了的

  • 然后按照中间分割区,选两个箭头一个指向左边最小,一个指向右边最小,将两个箭头对应的数比较,把较小的个放入上面的新列表

  • 赋值完成后,将绿色标记自增1。左侧红色标记自增1。

  • 然后继续比较两个数组红色标记处的元素。此时右侧数组元素小,所以将右侧数组标记处元素赋值给绿色数组的绿色标记处。

  • 重复上面的步骤

  • 最后得到结果

这就称为一次归并排序

 

1.3 代码实现一次递归排序
def sort(lst, low, mid, high):
i = low
j = mid +1 # low ----> mid 代表了前面所有拍好序的一个组 mid 到 mid + 1 是乱序部分 mid+1 到最后又是另一个排好序的组
lstm = []
while i <= mid and j <= high:
if lst[i] < lst[j]: #比较两个指针指向的数的大小,把小的一个append到心列表, 并且谁放进去了,谁索引自增一
lstm.append(lst[i])
i += 1
else:
lstm.append(lst[j])
j += 1 # 出现 某一边,可能是左边可能是右边先排完了,将剩下的有序数全部处理添加到新列表
while i <= mid:
lstm.append(lst[i])
i += 1 while j <= high:
lstm.append(lst[j])
j += high
lst[low: high+1] = lstm #最后将拍好序新列表的,赋值回传入的列表的索引段
  • 这样一次归并排序就完成了

 

二、递归实现归并排序
  • 代码实现
def all_sort(lst, low, high):

    if low < high:
mid = (low + high)//2 #1
all_sort(lst, low, mid) #2
all_sort(lst, mid+1, high) #3 sort(lst, low, mid, high) #开始排序
  • 如图 #1处: mid = (low + high)//2 将列表一分为二, #2处递归前半段, #3出递归后半段。

    如:low=0, mid=2时还剩 0, 1, 2 三个数。下次计算mid=(low + high)//2 mid = 1, low=0. 表明只剩下两个数了,然后计算 (0 + 1)//2 = 0 这时low = mid = 0,继续传入#2就不会递归了,

     

    既然是两个数,中间一分开左右都是有序的,将两个数按照大小拍好,然后开始不断的把所有结果和到一起

  • 这就是归并排序的分解 与 合并

归并排序Python 实现的更多相关文章

  1. 归并排序python实现

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

  2. 归并排序python实现源码

    将开发过程经常用到的一些代码片段收藏起来,下面的资料是关于归并排序python实现的代码,应该能对码农们有一些用. def mergesort(arr): if len(arr) == 1: retu ...

  3. 归并排序(Python)

    一.采用分治策略:将原问题划分成n个规模较小的但结构和原问题相同的子问题,递归解决这些子问题后合并各个结果从而得到原问题的解. 二.分治策略的步骤: 分解:将原问题分解成一系列子问题 解决:子问题粒度 ...

  4. 经典算法之归并排序——python和JS实现

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:韩忠康 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  5. 归并排序-Python实现

    归并排序(MergeSort) 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为 O(n\log n)(大O符号).1945年由约翰·冯·诺 ...

  6. 高速排序,归并排序,堆排序python实现

    高速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*l ...

  7. 常见排序算法-Python实现

    常见排序算法-Python实现 python 排序 算法 1.二分法     python    32行 right = length-  :  ]   ):  test_list = [,,,,,, ...

  8. python数据结构与算法——归并排序

    归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...

  9. 你需要知道的九大排序算法【Python实现】之归并排序

    四.归并排序 基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.归并过程:比 ...

随机推荐

  1. c/c++ 智能指针 weak_ptr 使用

    智能指针 weak_ptr 使用 weak_ptr用途: 1,解决空悬指针问题 2,解决循环引用问题 weak_ptr特点:没有*操作和->操作 weak_ptr是不控制所指对象生存周期的智能指 ...

  2. Docker 从入门到实践(一)Docker 简介

    读前须知:本教程大部分都是[Docker 从入门到实践 ]一书的知识,有兴趣可以直接观看书籍.同时,借鉴书籍的知识,如有侵权,请告知我,我会删除处理.谢谢. 一.什么是 Docker? Docker ...

  3. LeetCode算法题-Power of Four(Java实现-六种解法)

    这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4 ...

  4. Alpha阶段 - 博客链接合集

    Alpha阶段 - 博客链接合集 项目Github地址 安卓端(Stardust):https://github.com/StardustProject/Stardust 服务器端(Gravel):h ...

  5. Rancher2-----了解什么是rancher以及简单部署

    个人理解:就是相当于openstack的图形化界面,或者说应用程序的图形化界面,rancher功能就是在图形化界面去管理容器,包括运行容器,创建网络,存储等:rancher有个应用商店,可以根据自己的 ...

  6. [Git] Git操作命令

    基础操作 git配置 git config --global user.name "Your Name" git config --global user.email " ...

  7. 转://Oracle 单引号转义

    在ORACLE中,单引号有两个作用: 1:字符串是由单引号引用 2:转义. 单引号的使用是就近配对,即就近原则.而在单引号充当转义角色时相对不好理解 1.从第二个单引号开始被视为转义符,如果第二个单引 ...

  8. ORACLE直方图(10g)

    为什么需要直方图 ?当表中一列数据比较的值分布比较均匀时,optimzer可以很好的通过最大值,最小值和NDV(唯一值的个数),就可以判断出cardinality.对于cardinality越精确,o ...

  9. 002_cookie的session_id解释

    HTTP协议(http://www.w3.org/Protocols/)是“一次性单向”协议. 服务端不能主动连接客户端,只能被动等待并答复客户端请求.客户端连接服务端,发出一个HTTP Reques ...

  10. WiFi-ESP8266入门http(3-1)网页认证上网-post请求(原教程)

    教程:http://geek-workshop.com/thread-37484-1-1.html 源码:链接:https://pan.baidu.com/s/1yuYYqsM-WSOb0AbyAT0 ...