文章目录

  • Definition
  • Implementation
  • Performance

Definition

对于一个长度为 n n n 的表,我们可以把这张表看成是由 n n n 个长度为 1 1 1 的表组成的集合,然后我们对这些表两两合并——也就是所谓的归并,然后再对归并后得到的长度为原来的两倍(具体情况和 n n n 是偶数还是奇数有关)的新表中的元素进行排序,这样,我们就得到了 n / 2 n/2 n/2 个长度为 2 2 2 的表。重复上述过程,最终可以归并得到完整的长度为 n n n 的有序表,这就是归并排序(merge sort),而一次归并排序的过程称为一趟归并排序。显然,对于 n n n 的表来说,我们总共需要 log ⁡ n \log n logn 趟,每趟排序的时间复杂度为 O ( n ) O(n) O(n),所以我们可以得到归并排序的时间复杂度为:
T ( n ) = O ( n log ⁡ n ) (0) T(n)=O(n\log n)\tag{0} T(n)=O(nlogn)(0)

Implementation

合并的算法可以考虑空间换取时间的方法:申请一个长度为两个待合并有序表长度之和的一个空表,采用合并有序表的算法,此时时间复杂度为 O ( m a x ( m , n ) ) O(max(m,n)) O(max(m,n)),其中 m , n m,n m,n 为两个有序表的长度:

void merge(ElementType* seq, int low, int mid, int high){int* temp = new int[high - low + 1];// initialized ptr for the empty list and two lists going to be mergedint k = 0, i = low, j = mid;for(;i < mid && j <= high;k++){if(seq[j] < seq[i]){temp[k] = seq[j];j++;}else{temp[k] = seq[i];i++;}}// move rest elements into temp if necessary.// only one of the loops below will processwhile(i < mid){temp[k++] = seq[i++];}while(j <= high){temp[k++] = seq[j++];}// copy back into original listfor(i = low; i <= high;i++){seq[i] = temp[i];}return;
}void mergeSort(ElementType* seq, int low, int high){if(high < low){int mid = (low + high) / 2;// sort sub partmergeSort(seq, low, mid);mergeSort(seq, mid + 1, high);// merge the two sorted partsmerge(seq, low, mid, high);}return;
}

Performance

二路归并排序的性能:

  • 时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 空间复杂度:用到 n n n 个单元的辅助空间,所以空间复杂度为 O ( n ) O(n) O(n)
  • 稳定性:在合并过程中,我们判断条件采用的是当且仅当严格小于时将后面部分元素放置在前,因此当遇到值相同的情况时不会改变原有的相对次序,所以二路归并排序是一个稳定的算法

二路归并排序 Implemented With C++相关推荐

  1. 数据结构源码笔记(C语言):二路归并排序

    //实现二路归并排序算法#include<stdio.h> #include<malloc.h> #define MAXE 20 //线性表中最多元素个数typedef int ...

  2. 二路归并排序简介及其并行化

    1.归并排序简介 1.1算法思想 归并排序属于比较类非线性时间排序,比较类排序中性能最佳,应用较为广泛. 归并排序是分治法(Divide and Conquer)的一个典型的应用.将已有序的子序列合并 ...

  3. C++实现二路归并排序算法

    排序算法分为五大类,一共是有九种,如下: 插入类:直接插入排序.折半插入排序.希尔排序 交换类:冒泡排序.快速排序 选择类:简单选择排序.堆排序 归并类:二路归并排序 基数类:多关键字排序 九种算法的 ...

  4. 二路归并排序原理及JAVA实现

    归并类排序 基本思想:首先将原始无序序列划分为两个子序列,然后分别对每个子序列递归地进行排序,最后再将有序子序列合并. 归并排序基于分治策略思想.前面提到的基于分治的快速排序重在"分&quo ...

  5. 二路归并排序及时间复杂度分析

    序言 二路归并排序是一种效率极高的递归排序,将数组A化为有序数组时间复杂度为O(nlogn). 思想 二路归并排序分为拆分数组以及合并两个操作. 切分(自上而下)时间复杂度2*T(n/2) 每次从数组 ...

  6. 二路归并排序Python实现-III

    二路归并排序Python实现-III 归并排序 是一种 效率比较高并且稳定的算法.时间复杂度 O(NLog(N)),空间复杂度 O(N). 归并排序(Merge Sort)是建立在归并操作上的一种有效 ...

  7. 数据结构——二路归并排序和基数排序

    二路归并排序 算法原理 假设该数组为q,左边界为 l,右边界为 r,并设置临时数组tmp. 采用分治思想: 第一步:确定分界点: mid = l + r >>1. 第二步:递归划分左右两段 ...

  8. Sort List(二路归并排序)

    题目链接:https://leetcode.com/problems/sort-list/description/ 题目要求:对链表进行排序,时间复杂度O(n),常数的空间复杂度 两种解法,本质上都是 ...

  9. 排序算法之——二路归并排序

    排序算法之--二路归并排序 二路归并排序的思想: 一次排序过程,将已经各自有序的两个段的数据合并一个段,并且合并后依旧有序 开始,我们认为单个数据是有序的,一个数据就是一个段,一次排序之后,两个数据就 ...

最新文章

  1. Dundas使用手册
  2. usaco Raucous Rockers(dp)
  3. ubuntu安装vsftpd
  4. python字典数组排序sorted_Python利用sorted进行字典排序
  5. Linux Shell基础 - 流程控制 - for循环 - while 循环 - until循环
  6. 21秋期末考试土力学与地基基础10445k1
  7. 什么是引力波?它是怎么被发现的?
  8. 单元测试(UT)、功能测试(FT)(转)
  9. HTML form -enctype
  10. Python在SQLite数据库中动态创建数据表的思路与实现
  11. java并发包是谁编写的_0.Java并发包系列开篇
  12. 【目标检测】VOC2007数据集介绍
  13. 每天5分钟玩转Kubernetes | Liveness探测
  14. 2024考研《艺术学概论》彭吉象|复习笔记(上篇)(1-6章)
  15. 快递柜模拟程序【感知与控制】
  16. Backstepping(反步法)控制初学讲解
  17. 3D角色模型欣赏:韩国3D设计师 Jiwoong Choi 科幻3d角色
  18. 如何查找重复文件并快速删除,电脑查重复文件的方法
  19. 手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 #
  20. WSL2加载独立硬盘和设置固定IP

热门文章

  1. python点餐系统早餐_python 点餐系统(仅函数实现)
  2. 【CF】Codeforces 1702F
  3. vue-video-player在移动端点击视频画面不会暂停的问题
  4. 聊聊 GPL、LGPL 开源代码许可协议,顺便提一下 MIT
  5. 建荣Ax3268工作简记
  6. exsi删除虚拟机提示在当前状况下不允许执行此操作解决方法、vmware删除虚拟机提示在当前状况下不允许执行此操作解决方法
  7. SSD存储颗粒的现在与未来
  8. php中文转化为英文,json转码_解决PHP的json_encode处理中文被转码为全英文的方法...
  9. delphi 操作Excel插入图片
  10. 通过经纬度坐标计算两点间的距离以及角度关系(C++)