什么是归并排序

归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组, 再合并数组。

将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数, 谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把 另一个数组的剩余部分复制过来即可。


算法步骤

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
  4. 重复步骤 3 直到某一指针达到序列尾;
  5. 将另一序列剩下的所有元素直接复制到合并序列尾。

算法分析


归并排序的演示


时间复杂度

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(nlogn)
  • 稳定性:稳定

代码实现

def merge_sort(alist):'''归并排序'''n = len(alist)if n <= 1:return alistmid = n//2#left采用归并排序后形成的有序的新的列表left_li = merge_sort(alist[:mid])# right采用归并排序后形成的有序的新的列表right_li = merge_sort(alist[mid:])#将两个有序的子序列合并为一个新的整体left_pointer,right_pointer = 0,0result = []while left_pointer < len(left_li) and right_pointer < len(right_li):if left_li[left_pointer] <= right_li[right_pointer]:result.append(left_li[left_pointer])left_pointer += 1else:result.append(right_li[right_pointer])right_pointer += 1result += left_li[left_pointer:]result += right_li[right_pointer:]return resultif __name__ == '__main__':li = [7,3,5,1,6,4,8,2]print(li)result = merge_sort(li)print(result)

结果:

[7, 3, 5, 1, 6, 4, 8, 2]
[1, 2, 3, 4, 5, 6, 7, 8]

数据结构与算法笔记(十一)—— 归并排序相关推荐

  1. 数据结构与算法笔记(青岛大学王卓老师视频)

    写在前面的话: 因为在学习数据结构之前,学习过一年的算法,所以有一些基础,一些我觉得 没必要的代码或知识就没写上,记得多是一些知识点,写的可能对于别人来说 很难接受,望谅解.我学习算法是在Acwing ...

  2. JS数据结构与算法 笔记

    JS数据结构与算法笔记 前言:不定时更新说明 1. 栈(Stack) 1.1 基于数组实现栈 1.2 基于对象实现栈 1.3 基于链表实现栈 1.4 栈的简单应用 1.4.1 字符串中的括号匹配问题 ...

  3. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  4. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  5. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

  6. 11_JavaScript数据结构与算法(十一)树

    JavaScript 数据结构与算法(十一)树 树结构 什么是树? 真实的树: 树的特点: 树一般都有一个根,连接着根的是树干: 树干会发生分叉,形成许多树枝,树枝会继续分化成更小的树枝: 树枝的最后 ...

  7. 数据结构与算法笔记(王卓网课+教材+大话数据结构)

    数据结构与算法笔记(王卓网课+教材+大话数据结构) ##最新整理!!! 顺序存储结构的线性表P10-P21 顺序线性表的代码实现 链式线性表笔记 串笔记 绪论.算法(P1-P9)1.4数据起源结构 数 ...

  8. 明翰数据结构与算法笔记V0.8(持续更新)

    文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...

  9. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性

    一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...

  10. 数据结构与算法笔记总结

    学习资源推荐: 1.程序员面试.算法研究.编程艺术.红黑树.机器学习5大系列集锦 程序员面试.算法研究.编程艺术.红黑树.机器学习5大系列集锦_v_JULY_v的博客-CSDN博客 2.推荐!数据结构 ...

最新文章

  1. android脚步---不同界面之间切换
  2. 20172311-哈夫曼编码测试
  3. 【CV】YOLOv4最全复现代码合集(含PyTorch/TF/Keras和Caffe等)
  4. python测试框架untest怎么循环执行_unittest如何在循环遍历一条用例时生成多个测试结果...
  5. Turbo码:3GPP TS 36.212
  6. 【论文】Awesome Relation Extraction Paper(关系抽取)(PART V)
  7. TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别
  8. 软件测试宝藏图_tSQLt –数据库单元测试中被遗忘的宝藏
  9. cocos creator android之微信开放平台修改签名 baseResp.errCode=-6
  10. 想学习C语言,学习路线是什么?
  11. 敏捷开发之产品级经验分享
  12. ipcfg报错_CentOS服务器安装Anaconda
  13. 计算机组成原理符号标志,计算机组成原理之数据的表示及运算
  14. VOIP技术发展综述与外呼系统的关系
  15. 【BH区块链项目热点问答】加拿大石油公司利用废弃天然气为挖掘BTC提供动力。你怎么看?...
  16. 基于DPCA的线性监督分类的故障诊断方法-T2和SPE统计量的计算
  17. 四川大学计算机专业调剂,四川大学计算机学院(软件学院)2019考研调剂信息...
  18. 联想笔记本桌面计算机不见了,桌面上的图标不见了怎么办,教您桌面上的图标不见了怎么办...
  19. 量子计算 3 量子门与测量
  20. DDD---领域驱动设计(一)

热门文章

  1. rpgmaker mv修改_吴青峰版一点点MV 释出,唱作女帝陈珊妮执导
  2. 3. Leetcode 16. 最接近的三数之和 (数组-双向双指针)
  3. 机器学习笔记:(时间序列中的线性回归)如何选择预测变量
  4. Tableau实战系列Tableau基础概念全解析 (二)-万字长文解析数据类型及数据集
  5. tableau实战系列(三十九)-Tableau可视化之多种地图绘制汇总
  6. 机器学习算法与Python实践之(一)k近邻(KNN)
  7. Python中numpy库unique函数解析
  8. matplotlib-pie-绘制饼状图
  9. 数据算法:推荐系统的实践与思考(下)【转】
  10. 全链路监控方案概述与比较