归并排序(Merge sort),是创建在归并操作上的一种有效的排序算法,效率为O(nlog n)。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。

一、算法基本思想

(1)基本思想

归并排序的基本思想就是:把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。经常被使用的是二路归并算法,即将两个已经排序的序列合并成一个序列的操作。

(2)运行过程

归并排序算法的运行过程如下:

1、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

2、设定两个指针,最初位置分别为两个已经排序序列的起始位置;

3、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

4、重复步骤3直到某一指针达到序列尾;

5、将另一序列剩下的所有元素直接复制到合并序列尾。

(3)示例


二、算法实现(核心代码)

C++实现:

template<typename T> //整数或浮点数皆可使用
void merge_sort(T arr[], int len) {T* a = arr;T* b = new T[len];for (int seg = 1; seg < len; seg += seg) {for (int start = 0; start < len; start += seg + seg) {int low = start, mid = min(start + seg, len), high = min(start + seg + seg, len);int k = low;int start1 = low, end1 = mid;int start2 = mid, end2 = high;while (start1 < end1 && start2 < end2)b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];while (start1 < end1)b[k++] = a[start1++];while (start2 < end2)b[k++] = a[start2++];}T* temp = a;a = b;b = temp;}if (a != arr) {for (int i = 0; i < len; i++)b[i] = a[i];b = a;}delete[] b;
}

Java实现:

public void merge_sort(int[] arr) {int len = arr.length;int[] result = new int[len];int block, start;for(block = 1; block < len ; block *= 2) {for(start = 0; start <len; start += 2 * block) {int low = start;int mid = (start + block) < len ? (start + block) : len;int high = (start + 2 * block) < len ? (start + 2 * block) : len;//两个块的起始下标及结束下标int start1 = low, end1 = mid;int start2 = mid, end2 = high;//开始对两个block进行归并排序while (start1 < end1 && start2 < end2) {result[low++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];}while(start1 < end1) {result[low++] = arr[start1++];}while(start2 < end2) {result[low++] = arr[start2++];}}int[] temp = arr;arr = result;result = temp;}result = arr;
}

三、性能(算法时间、空间复杂度、稳定性)分析

归并排序的时间复杂度为O(nlogn);空间复杂度为O(n);是稳定的排序算法。

归并排序速度仅次于快速排序,为稳定排序算法。一般用于对总体无序,但是各子项相对有序的数列效果比较好。

经典排序算法(8)——归并排序算法详解相关推荐

  1. kmeans python interation flag_机器学习经典算法-logistic回归代码详解

    一.算法简要 我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类.这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下: 可以较为清楚的看到,当输入的x小于0 ...

  2. 操作系统:基于页面置换算法的缓存原理详解(下)

    概述: 在上一篇<操作系统:基于页面置换算法的缓存原理详解(上)>中,我们主要阐述了FIFO.LRU和Clock页面置换算法.接着上一篇说到的,本文也有三个核心算法要讲解.分别是LFU(L ...

  3. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  4. 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...

  5. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

  6. 排序算法:归并排序算法实现及分析

    归并排序算法介绍 归并排序(Merging Sort)就是利用归并的思想实现排序的放.它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个 ...

  7. Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

  8. KMP算法之next数组详解

    KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...

  9. SMART S7-200PLC流量累计算法实现(梯形图算法详解+优化)

    流量累计基于积分的原理,采用细分面积的方法近似计算瞬时流量的累加.离散上也就是累加求和.公式虽然简单但是流量累计仍有些需要注意的地方,下面一一和大家举例说明. 1.数值积分的通式 2.梯形积分公式 从 ...

  10. matlab中存档算法代码,Matlab中的FCM算法代码及中文详解

    Matlab中的FCM算法代码及中文详解 转自:http://xiaozu.renren.com/xiaozu/106512/336681453 function [center, U, obj_fc ...

最新文章

  1. 如何撤消Git中的最新本地提交?
  2. Mylyn 2.0,第 2 部分: 自动上下文管理
  3. 视觉SLAM学习--相机成像模型及标定
  4. 【thymeleaf】转义符:使用转义符拼接输出单引号
  5. linux驱动内核哪个文件夹,linux设备驱动归纳总结(一):内核的相关基础概念...
  6. 爱立信与中国联通成功完成国内首个LTE三载波聚合大规模部署测试
  7. android 自定义桌面图标大小设置,手机桌面图标尺寸可以改?OriginOS重新定义个性化...
  8. 深度优化LNMP之Nginx [1]
  9. 2021 Spring 自定义注解 +AOP +方法入参
  10. 【Coursera】Third Week(1)
  11. python 装机配置_Python实现自动装机功能案例分析
  12. python中去掉外部引号的函数是_在Python中删除String中的引号
  13. 淘淘商城系列——Solr集群搭建
  14. 重装显卡驱动,解决NVIDIA-SMI has failed问题
  15. import requests
  16. Vue .sync 语法糖
  17. 网络TCP/IP基础(IP地址与子网划分)
  18. 解决树莓派播放音频时耳机插线了但没有声音
  19. cocos creator pc web端 全屏
  20. Win10软件环境变量配置(配置原因、配置步骤)

热门文章

  1. linux修改windows注册表,妙招:让修改的注册表立即生效的几种方法
  2. html5储存类型,html5本地存储-留言板
  3. 豆瓣9.6分!再一次被BBC的纪录片震惊!
  4. 朋友圈有趣的灵魂都去哪了?这几个优质公号给你答案
  5. 当时我就震惊了:无穷带来的各种悖论
  6. 给所有想从事软件研发的年轻工程师的忠告与建议
  7. linux重定向输出时加时间变量,shell 重定向错误输出到文件 加上时间(标明错误抛出的时间)...
  8. docker源码_使用docker、Jenkins、gitlee、springboot、搭建个人博客网站 并实现CI/CD 外加机器人提醒...
  9. python8皇后不攻击问题_Python八皇后问题(落最后一颗子)
  10. 移动计算机怎么开机密码,win7忘记开机密码解决办法