人工智能你必须掌握的32个算法(二)归并排序算法
2019独角兽企业重金招聘Python工程师标准>>>
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序通过将已有序的子序列合并,得到完全有序的序列。那么我们如何将一个无序的序列拆分成有序子序列呢?
归并排序的核心是分治,对于一个无序序列A,假设将序列A拆分成两个序列A1、A2,我们无法保证A1、A2有序,然后我们继续将A1、A2序列继续分解成A11、A12、A21、A22,直至每个序列中只有一个元素,如此即可保证每个子序列有序了。该步骤即“分”。
好了,我们已经得到N个(数据长度个)有序子序列了,下面该进行到“治”的步骤了。对于每两个有序子序列,我们将起两两合并。
对于任意两个需要合并的子序列,将先用每个序列第一个元素进行比较,将较小元素放入新序列,然后将已放入新序列的子序列第二个元素和另一个序列第一个元素进行比较,直至两个序列所有数全部加入新序列为止。
代码实现:
def sort(oldArray):if len(oldArray) == 1:return oldArraymidd = len(oldArray)//2oldArray1 = sort(oldArray[:midd])oldArray2 = sort(oldArray[midd:])return merge(oldArray1, oldArray2)def merge(oldArray1, oldArray2):newArray = []i = 0j = 0while i < len(oldArray1) and j < len(oldArray2):if oldArray1[i] <= oldArray2[j]:newArray.append(oldArray1[i])i += 1else:newArray.append(oldArray2[j])j += 1newArray += oldArray1[i:] # 将两个数组剩余元素加入新数组newArray += oldArray2[j:]return newArrayprint(sort([12, 67, 5, 62, 94, 22, 56]))
转载于:https://my.oschina.net/mutoushirana/blog/1854644
人工智能你必须掌握的32个算法(二)归并排序算法相关推荐
- 排序算法:归并排序算法实现及分析
归并排序算法介绍 归并排序(Merging Sort)就是利用归并的思想实现排序的放.它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个 ...
- 算法竞赛——归并排序算法
算法竞赛--归并排序算法 分治法 划分问题:把序列分成元素个数尽量相等的两半 递归求解:把两半元素分别排序 合并问题:把两个有序表合并成一个 借鉴RuJia的精妙的合并过程 void merges2( ...
- 算法设计与分析 ——插入排序算法与归并排序算法比较
插入排序算法与归并排序算法比较 实验目的 通过插入排序算法与归并排序算法效率对比体会算法在求解问题中的重要性. 实验内容 分别编写函数实现插入排序算法和归并排序算法: 利用随机函数产生大量数据存入数组 ...
- java的归并排序算法_归并排序算法Java实现
一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...
- 【排序算法】归并排序算法原理
归并排序 概念 使用前提 算法思路 适用场景 算法描述 递归法(Top-down) 分而治之 迭代法(Bottom-up) 迭代 概念 归并排序是建立在归并操作上的一种有效的排序算法. 该算 ...
- 机器学习笔记之EM算法(二)EM算法公式推导过程
机器学习笔记之EM算法--EM算法公式推导过程 引言 回顾:EM算法公式 推导过程 引言 上一节介绍了隐变量和EM算法,以及 以EM算法公式为条件,证明了随着EM算法迭代步骤的增加,每次迭代得到新的模 ...
- JavaScript实现十种经典排序算法(js排序算法)
冒泡排序算法 冒泡排序(Bubble Sort)是一种简单直观的排序算法.冒泡排序算法的步骤描述如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一 ...
- 【数据结构与算法】【算法思想】分治算法
贪心算法 回溯算法 分治算法 动态规划 MapReduce本质就是分治算法,是Google大数据处理的三驾马车之一,另外两个是GFS和Bigtable.它在倒排索引,PageRank计算,网页分析等搜 ...
- 排序算法(五)——堆排序算法详解及Python实现
本文目录 一.简介 二.算法介绍 三.代码实现 排序算法系列--相关文章 一.简介 堆排序(Heap Sort)算法,属于选择排序类,不稳定排序,时间复杂度O(nlogn). 堆排序由Floyd和Wi ...
- 图像特征算法(三)——ORB算法简述及Python中ORB特征匹配实践
计算机视觉专栏传送 上一篇:图像特征算法(二)--SURF算法简述及Python标记SURF特征检测实践 下一篇:持续创作中- 目录 计算机视觉专栏传送 一.ORB算法 1.算法简介 2.FAST寻找 ...
最新文章
- 吴恩达深度学习课程deeplearning.ai课程作业:Class 1 Week 2 assignment2_1
- [剑指offer]面试题第[57-2]题[JAVA][和为s的连续正数序列][数学法][滑动窗口]
- MySQL入门之插入、删除、修改表数据
- Qt532.线程(_beginthread)
- hashmap删除指定key_「集合系列」- 深入浅出分析HashMap
- 响应内容类型为CSV
- 【luogu3372】线段树 1 模板
- struts 2.3.8备忘
- Android——简单模拟银行转账
- 【2022年】浙江省专升本数学全面总结-(空间解析几何与向量代数)
- Provisional headers are shown axios 超时处理
- 企业微信Robot(群聊机器人)消息推送Java服务
- html风琴图片展示,基于jquery的手风琴图片展示效果实现方法
- Ralink SDK相关指令总结
- 记一次收到QQ邮箱钓鱼邮件经历
- FTP上传成功之后却查找不到文件
- 知识图谱系列-2-知识图谱发展历程及其分类
- hbase应用场景 java_Hbase Java API 使用
- matlab 读取 通达信,Matlab 自动导入通达信板块文件
- 【精】LintCode领扣算法问题答案:1086. 重复字符串匹配
热门文章
- java 线程修改数据库连接_如何强制Java线程关闭线程本地数据库连接
- 微服务架构学习笔记(一):gRPC Spring Boot Starter 2.2.0 发布,及使用步骤
- PHP 可变变量的使用
- 全网首发:deb打包时报错dh: Please specify the compatibility level in debian/compat
- 怀念的不是初恋,是那段时光
- 管理感悟:看清软件功能的“二八定律”
- 剪裁NV21任意一部分的代码
- IP地址 网络地址 主机地址
- 用GlobalMemoryStatus获取系统内存信息
- linux cmake 快速安装