07 归并排序 (Merge Sort)

归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置;
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
重复步骤3直到某一指针超出序列尾;
将另一序列剩下的所有元素直接复制到合并序列尾;
//循环实现void merge(int arr[], int l, int m, int r)
{ int i, j, k; int n1 = m - l + 1; int n2 =  r - m; int L[n1], R[n2]; for (i = 0; i < n1; i++) L[i] = arr[l + i]; for (j = 0; j < n2; j++) R[j] = arr[m + 1+ j]; i = 0; j = 0; k = l; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else{ arr[k] = R[j]; j++; } k++; }   while (i < n1) { arr[k] = L[i]; i++; k++; }   while (j < n2) { arr[k] = R[j]; j++; k++; }
} void merge_sort(int arr[], int l, int r)
{ if (l < r) { int m = l+(r-l)/2;   mergeSort(arr, l, m); mergeSort(arr, m+1, r);  merge(arr, l, m, r); }
} 

//递归实现
void merge(int arr[], int tmp[], int start, int end, int middle) {int l, r, s;s = start;l = start;r = middle + 1;while (l <= middle && r <= end) {if (arr[l] <= arr[r]) tmp[s++] = arr[l++];else tmp[s++] = arr[r++];}while (l <= middle) tmp[s++] = arr[l++];while (r <= end) tmp[s++] = arr[r++];for (;start <= end;start++)arr[start] = tmp[start];
}void msort(int arr[], int *tmp, int start, int end) {int middle;if (start < end) {middle = (start + end) / 2;msort(arr, tmp, start, middle);msort(arr, tmp, middle + 1, end);merge(arr, tmp, start, end, middle);}
}void merge_sort(int arr[], int n) {int *tmp = (int*)malloc(n*sizeof(int));msort(a, tmp, 0, n - 1);free(tmp);
} 

空间效率:O(n)

时间效率:最好情况:O(Nlog2N)                平均情况:O(Nlog2N)                        最坏情况:O(Nlog2N)

稳定性(相同元素相对位置变化情况):稳定

转载于:https://www.cnblogs.com/wanghao-boke/p/10424405.html

九大经典算法之归并排序相关推荐

  1. 九大经典算法之选择排序、堆排序

    05 选择排序 (Selection Sort) 原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序 ...

  2. 九大经典算法之冒泡排序、快速排序

    03 冒泡排序(Bubble Sort) 每次选择两个元素,按照需求进行交换(比如需要升序排列的话,把较大的元素放在靠后一些的位置),循环 n 次(n 为总元素个数),这样小的元素会不断 " ...

  3. 九大经典算法之基数排序、桶排序

    08 基数排序(Radix Sort) 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.排序过程是将所有待比较数值统一为同样的数位长度,数位较短的数前 ...

  4. 九大经典算法之插入排序、希尔排序

    01 插入排序(Insertion Sort) 原理:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置. void insertion_sort(int arr[] ...

  5. 「干货」编程语言十大经典算法,你知道几个?

    算法与数据结构是计算机学习路上的内功心法,也是学好编程语言的重要基础.今天给大家介绍一下十大经典算法. 十大经典算法分别是:冒泡排序,插入排序,选择排序,希尔排序,快速排序,归并排序,桶排序,堆排序, ...

  6. 九大排序算法Java实现

    之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...

  7. 数据挖掘十大经典算法(转载)

    数据挖掘十大经典算法 一.C4.5      C4.5,是机器学习算法中的一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法ID3的改进算法,所以基 ...

  8. 十大经典算法总结(JavaScript描述)

    前言 读者自行尝试可以想看源码戳这,博主在github建了个库,欢迎star.读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算 ...

  9. c语言折半排序的程序,C语言实现九大排序算法的实例代码

    直接插入排序 将数组分为两个部分,一个是有序部分,一个是无序部分.从无序部分中依次取出元素插入到有序部分中.过程就是遍历有序部分,实现起来比较简单. #include void insertion_s ...

最新文章

  1. 使用 Vue 2.0 实现服务端渲染的 HackerNews
  2. 2020年春季学期信号与系统课程作业参考答案-第十次作业
  3. 如何在Win7以上环境使用VC++6
  4. Java IO: InputStreamReader和OutputStreamWriter
  5. 用Tomcat构建一个简单图片服务器
  6. python非法变量名_数据库错误:ORA-01036:非法变量名/numb
  7. cookie购物车php简单,php中利用cookie实现购物车实例_PHP教程
  8. C# Winform 运行异常 CefSharp.core.dll 找不到指定的模块
  9. excel oss 上传_阿里云对象存储OSS全系统教程
  10. Java集成快递100的订阅服务和根据物流单号查询物流详情的接口
  11. 2014年5月欧洲地区SAT写作真题及解题技巧
  12. MATLAB---三维绘制函数实例介绍
  13. 融易投3周年庆——欢乐送豪礼
  14. SQLite Reader 插件测试SQLite语法
  15. nssl 1438.战略威慑
  16. 为此计算机所有用户安装加载项,此网站需要运行以下加载项……如果您信任该网站和该加载项并允许运行该加载项...
  17. Linux基本操作知识一
  18. VMware虚拟机修改BIOS启动项
  19. 哥去面试,每次都被赶出来,没天理
  20. 币圈一级市场丨coinlist上新系列——TRIBL

热门文章

  1. Android之封装好的异步网络请求框架
  2. 代码分享h5-sessionStorage,提示app下载代码块
  3. 【动态规划】【多重背包】[HDU 1291]悼念512汶川大地震遇难同胞――珍惜现在,感恩生活...
  4. 【SQL】sql版Split函数。用于拆分字符串为单列表格
  5. 设计模式笔记——Bridge
  6. 虚拟机照样飞速跑Windows Server2008
  7. 用python做自我介绍_python入门教程NO.2 用python做个自我介绍
  8. 如何用python画组合图形_python结合G2绘制精美图形
  9. 二维有限元方程matlab,有限元法求解二维Poisson方程的MATLAB实现
  10. qq2009显ip版怎么用_毛孔粗大怎么破?用对方法,轻松改善显皮肤嫩滑