归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

//将有序数组a[]和b[]合并到c[]中

void MemeryArray(int a[], int n, int b[], int m, int c[])

{

int i, j, k;

i = j = k = 0;

while (i < n && j < m)

{

if (a[i] < b[j])

c[k++] = a[i++];

else

c[k++] = b[j++];

}

while (i < n)

c[k++] = a[i++];

while (j < m)

c[k++] = b[j++];

}

可以看出合并有序数列的效率是比较高的,可以达到O(n)。

解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成二组A,B,如果这二组组内的数据都是有序的,那么就可以很方便的将这二组数据进行排序。如何让这二组组内数据有序了?

可以将A,B组各自再分成二组。依次类推,当分出来的小组只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的二个小组就可以了.

这样通过先递归的分解数列,再合并数列就完成了归并排序。

下面给出了代码。

bool MergeSort(int a[], int n)

{

int *pTempArray = new int[n];

if (p == NULL)

return false;

mergesort(a, 0, n - 1, pTempArray);

return true;

}

void mergesort(int a[], int first, int last, int temp[])

{

if (first < last)

{

int mid = (first + last) / 2;

mergesort(a, first, mid, temp);    //左边有序

mergesort(a, mid + 1, last, temp); //右边有序

mergearray(a, first, mid, last, temp); //再将二个有序数列合并

}

}

//将有二个有序数列a[first...mid]和a[mid...last]合并。

void mergearray(int a[], int first, int mid, int last, int temp[])

{

int i = first, j = mid + 1;

int m = mid,   n = last;

int k = 0;

while (i <= m && j <= n)

{

if (a[i] < a[j])

temp[k++] = a[i++];

else

temp[k++] = a[j++];

}

while (i <= m)

temp[k++] = a[i++];

while (j <= n)

temp[k++] = a[j++];

for (i = 0; i < k; i++)

a[first + i] = temp[i];

}

归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。

因为归并排序每次都是在相邻的数据中进行操作,所以归并排序在O(N*logN)的几种排序方法(快速排序,归并排序,希尔排序,堆排序)也是效率比较高的。

在本人电脑上对冒泡排序,直接插入排序,归并排序及直接使用系统的qsort()进行比较(均在Release版本下)

对20000个随机数据进行测试:

对50000个随机数据进行测试:

再对200000个随机数据进行测试:

注:有的书上是在mergearray()合并有序数列时分配临时数组,但是过多的new操作会非常费时。因此作了下小小的变化。只在MergeSort()中new一个临时数组。后面的操作都共用这一个临时数组。

排序算法--归并排序相关推荐

  1. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...

  2. python排序算法——归并排序(附代码)

    python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  3. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  4. 排序算法 —— 归并排序

    归并排序算法 1.划分问题:把序列分成元素个数尽量相等的两半. 2.递归求解:把两半元素分别排序. 3.合并问题:把两个有序表合并成一个. 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用 ...

  5. 二分归并排序算法_第五篇排序算法|归并排序

    0x01,前言闲叙 最近几年很少看电视了,因为没时间看了,除了偶尔刷刷头条,基本上不会花大块的时间沉迷于电视剧,综艺,这或许就是短视频时代所带来的一些改变吧,我们都会深受其中. 0x02,先看下这篇文 ...

  6. 【算法】排序算法——归并排序

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言        归并排序是分治法在排序问题上的运用,因此为了更好地了解归并排序,首先了解 ...

  7. 八大排序算法 —— 归并排序

    归并排序 归并算法的理解比较难,是一种区别于插入算法,选择算法和交换算法的一种独特算法,需要逐步理解. 核心思想:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治( ...

  8. 基础排序算法----归并排序

    归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序列:即先使 ...

  9. 排序算法-归并排序的时间复杂度分析

    归并排序,其实就是递归+合并. 归并排序将数组取中间分为两部分,两个子数组分别各自再从中间分为两个子数组,一直分下去直到不能再分.分完之后,再按照子数组大小合并为为一个有序数组,然后层层向上合并,直到 ...

  10. 排序算法-归并排序的实现与时间复杂度分析

    归并排序 归并排序是分而治之的排序算法. 划分步骤很简单:将当前数组分成两半(如果N是偶数,则将其完全平等,或者如果N是奇数,则一边稍大于一个元素),然后递归地对这两半进行排序. 递归写法 归并排序递 ...

最新文章

  1. BZOJ1857 Scoi2010 传送带 【三分】
  2. Java利用QRCode.jar包实现二维码编码与解码
  3. 「比人还会聊天」百度PLATO对话机器人开放体验
  4. iOS-各种动画特效
  5. 年过20载,超1000万人在用,还说要被淘汰?
  6. jquery取得text,areatext,radio,checkbox,select的值
  7. 【HDU 6020】 MG loves apple (乱搞?)
  8. 挂载程序在我的第一台阿里云服务器上
  9. 【图像变换】基于matalb DIBR-3D图像变换【含Matalb源码 082期】
  10. java awt 教程_JAVA教程第五讲AWT图形用户界面设计
  11. python二维码批量拼接,多张高清二维码批量拼接
  12. [转][学习]软件绿色联盟应用体验标准5.0_功耗标准-公示版
  13. Epson爱普生L3100 L3101 L3110 L3150 L3168系列清零软件废墨清零软件+教程
  14. 检测华为网络设备的常用命令
  15. CentOS历史版本下载
  16. 视频接入AI平台技术方案
  17. 学习使用安卓scroller
  18. linux安装界面键盘失灵,安装win7鼠标键盘失灵怎么办_win7安装界面鼠标键盘失灵解决方法【147下载站】...
  19. 百胜中国二次上市:肯德基与必胜客贡献九成营收,春华资本是股东
  20. 常用的图像特征提取方法

热门文章

  1. ipsec在企业网中的应用(IKE野蛮模式)(转)
  2. ARM 中断状态和SVC状态的堆栈切换 (异常)【转】
  3. grails 保存图片
  4. 关于全局低级键盘hook的记录(WH_KEYBOARD_LL)
  5. 2月18 多项式拟合原理、全过程,loss函数,正则化,迭代与梯度下降,plotly
  6. 无法打开登录所请求的数据库 xxxx。登录失败。 用户 'NT AUTHORITY\SYSTEM' 登录失败。...
  7. HTML5学习笔记 二:article和section
  8. BZOJ4435 : [Cerc2015]Juice Junctions
  9. 桌面支持--teamviwer如果没装杀毒软件,会有警告
  10. zabbix监控第一台服务器(10)