基本思想

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

算法原理

归并操作指的是将两个已经排序的序列合并成一个序列的操作,归并操作步骤如下:

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

特点

数据结构:数组

稳定性:稳定

过程

排序过程            宏观过程

复杂度与辅助空间

最差时间复杂度:O(nlogn)

最优时间复杂度:O(nlogn)

平均时间复杂度:O(nlogn)

所需辅助空间:O(n)

源程序

//将有二个有序数列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];
}
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); //再将二个有序数列合并  }
}  bool MergeSort(int a[], int n)
{  int *p = new int[n];  if (p == NULL)  return false;  mergesort(a, 0, n - 1, p);  delete[] p;  return true;
}

归并排序(Merge_Sort)相关推荐

  1. 疯子的算法总结(六) 复杂排序算法 ① 归并排序 merge_sort()

    归并排序采取了分治的思想,每次分别排左半边和右半边,不断递归调用自己,直到只有一个元素递归结束,开始回溯,调用merge函数,合并两个有序序列,再合并的时候每次给末尾追上一个最大int这样就不怕最后一 ...

  2. C++算法之归并排序

    C++算法之归并排序 文章目录 C++算法之归并排序 一.归并排序思想 二.排序步骤 三.代码实现 四.复杂度分析 一.归并排序思想 回顾快速排序的基本思想:找出一个分界线,并以该分界线为界将数组分为 ...

  3. 归并排序算法详解及示例

    归并排序 归并排序算法是在分治算法的基础上设计出来的一种排序算法,它可以可以对指定的序列完成升序,(由小到大),或降序(由大到小),时间复杂度为 O ( n l o g n ) O(nlogn) O( ...

  4. 排序算法的实现。用C语言编程实现冒泡排序、选择排序、插入排序、shell排序、快速排序、堆排序算法、归并排序。利用随机函数产生N个随机整数(10000以上)。

    #include<stdio.h> #include <time.h> #include<stdlib.h> #define N 10000 double T, T ...

  5. 选择排序稳定吗_最常见的四种数据结构排序算法你不知道?年末怎么跳槽涨薪...

    前言 在学习数据结构的时候必然接触过排序算法,而且在日常开发中相信排序算法用得也比较多.而排序算法众多,各个效率又不同,难以记住.小编今天会介绍一些常用排序算法的特点和实现,对比不同排序算法的效率. ...

  6. Python数据结构常见的八大排序算法(详细整理)

    前言 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法. 常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 下 ...

  7. JAVA:数组,排序,查找4

    一.数组 1.一维数组 (1).数组的定义 数据类型 数组名[]=new 数据类型[大小] public class Demo1 {public static void main(String[] a ...

  8. 利用MPI实现并行排序算法PSRS

    参考 MPI实现psrs MPI并行正则采样排序PSRS算法原理及实现 实验题目 利用MPI实现并行排序算法PSRS 实验环境 操作系统 编译器 硬件配置 Ubuntu 16.04 mpicc 双核 ...

  9. 基础算法(一)零基础学算法---总结大篇

    基础算法(一) 纯干货!! 排序及二分算法 码了7天,手残党也能看懂!! 手残第一篇:第一章 基础算法(一) 提示:你的三连是作者输出下去的动力哦!!真的真的!!!(小声哔哔:赶紧收藏!!内容持续更新 ...

最新文章

  1. 创新类编辑推荐:Sequence iBPMS平台
  2. 解决Unsupported major.minor version 51.0错误
  3. python经典100例答案pdf-Python 入门 100 案例,PDF免费下载
  4. eBay测试老兵的修炼之道:如何从测试“小工”到测试“专家”?
  5. rs.Open SQL,Conn,adOpenStatic,adLockOptimistic
  6. python filter()和reduce()函数用法详解
  7. 结构体命名中的尾标ST是什么意思?(struct)
  8. Unity4.6.2发布 支持64位iOS
  9. cad填充图案乱理石_CAD图案填充应该这么操作!简单又高效!!!1分钟就能学会...
  10. 使用 Gatsby.js 搭建静态博客 2 实现分页
  11. 怎么认识自己--《思辩与立场:生活中无处不在的批判性思维工具》
  12. python读取lmdb文件_LMDB 的 Python 接口使用方法
  13. stm32的语音识别_基于STM32的嵌入式语音识别模块设计
  14. 软考软件设计师-软件工程基础知识
  15. 太阳直射点纬度计算公式_干货 | 初中地理经纬度难点梳理+习题练手!必考建议收藏~...
  16. 努力成为一个有本事,没脾气的程序员
  17. 如何充分利用云计算解决云备份?
  18. superset集成echarts
  19. The Staircases
  20. 折磨人的商业计划书 (ZT)

热门文章

  1. api接口加密_谈谈API接口开发中的安全性如何解决
  2. php中浮点型的精确度,PHP中的浮点精度和类型
  3. linux 空格函数,linux c语言的split函数和空格处理函数
  4. php5.6 交叉编译,Cross-compile - 龙芯开源社区
  5. python拷贝文件函数_Python Set集合,函数,深入拷贝,浅入拷贝,文件处理
  6. sonarqube连mysql_.net持续集成sonarqube篇之sonarqube安装与基本配置
  7. 四十五、深入Java的网络编程(上篇)
  8. 记录处理搜狗新闻分类
  9. 计算机网络应用基础第一章试题,计算机网络应用基础第一章测试题
  10. docker多个容器一起打包_详解Docker 容器基础系统镜像打包