九大经典算法之归并排序
07 归并排序 (Merge Sort)
//循环实现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
九大经典算法之归并排序相关推荐
- 九大经典算法之选择排序、堆排序
05 选择排序 (Selection Sort) 原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序 ...
- 九大经典算法之冒泡排序、快速排序
03 冒泡排序(Bubble Sort) 每次选择两个元素,按照需求进行交换(比如需要升序排列的话,把较大的元素放在靠后一些的位置),循环 n 次(n 为总元素个数),这样小的元素会不断 " ...
- 九大经典算法之基数排序、桶排序
08 基数排序(Radix Sort) 基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.排序过程是将所有待比较数值统一为同样的数位长度,数位较短的数前 ...
- 九大经典算法之插入排序、希尔排序
01 插入排序(Insertion Sort) 原理:每次选择一个元素,并且将这个元素和整个数组中的所有元素进行比较,然后插入到合适的位置. void insertion_sort(int arr[] ...
- 「干货」编程语言十大经典算法,你知道几个?
算法与数据结构是计算机学习路上的内功心法,也是学好编程语言的重要基础.今天给大家介绍一下十大经典算法. 十大经典算法分别是:冒泡排序,插入排序,选择排序,希尔排序,快速排序,归并排序,桶排序,堆排序, ...
- 九大排序算法Java实现
之前学习数据结构与算法时花了三天时间整理九大排序算法,并采用Java语言来实现,今天第一次写博客,刚好可以把这些东西从总结的文档中拿出来与大家分享一下,同时作为自己以后的备忘录. 1.排序算法时间复杂 ...
- 数据挖掘十大经典算法(转载)
数据挖掘十大经典算法 一.C4.5 C4.5,是机器学习算法中的一个分类决策树算法,它是决策树(决策树也就是做决策的节点间的组织方式像一棵树,其实是一个倒树)核心算法ID3的改进算法,所以基 ...
- 十大经典算法总结(JavaScript描述)
前言 读者自行尝试可以想看源码戳这,博主在github建了个库,欢迎star.读者可以Clone下来本地尝试.此博文配合源码体验更棒哦~~~ 个人博客:Damonare的个人博客 原文地址:十大经典算 ...
- c语言折半排序的程序,C语言实现九大排序算法的实例代码
直接插入排序 将数组分为两个部分,一个是有序部分,一个是无序部分.从无序部分中依次取出元素插入到有序部分中.过程就是遍历有序部分,实现起来比较简单. #include void insertion_s ...
最新文章
- 使用 Vue 2.0 实现服务端渲染的 HackerNews
- 2020年春季学期信号与系统课程作业参考答案-第十次作业
- 如何在Win7以上环境使用VC++6
- Java IO: InputStreamReader和OutputStreamWriter
- 用Tomcat构建一个简单图片服务器
- python非法变量名_数据库错误:ORA-01036:非法变量名/numb
- cookie购物车php简单,php中利用cookie实现购物车实例_PHP教程
- C# Winform 运行异常 CefSharp.core.dll 找不到指定的模块
- excel oss 上传_阿里云对象存储OSS全系统教程
- Java集成快递100的订阅服务和根据物流单号查询物流详情的接口
- 2014年5月欧洲地区SAT写作真题及解题技巧
- MATLAB---三维绘制函数实例介绍
- 融易投3周年庆——欢乐送豪礼
- SQLite Reader 插件测试SQLite语法
- nssl 1438.战略威慑
- 为此计算机所有用户安装加载项,此网站需要运行以下加载项……如果您信任该网站和该加载项并允许运行该加载项...
- Linux基本操作知识一
- VMware虚拟机修改BIOS启动项
- 哥去面试,每次都被赶出来,没天理
- 币圈一级市场丨coinlist上新系列——TRIBL
热门文章
- Android之封装好的异步网络请求框架
- 代码分享h5-sessionStorage,提示app下载代码块
- 【动态规划】【多重背包】[HDU 1291]悼念512汶川大地震遇难同胞――珍惜现在,感恩生活...
- 【SQL】sql版Split函数。用于拆分字符串为单列表格
- 设计模式笔记——Bridge
- 虚拟机照样飞速跑Windows Server2008
- 用python做自我介绍_python入门教程NO.2 用python做个自我介绍
- 如何用python画组合图形_python结合G2绘制精美图形
- 二维有限元方程matlab,有限元法求解二维Poisson方程的MATLAB实现
- qq2009显ip版怎么用_毛孔粗大怎么破?用对方法,轻松改善显皮肤嫩滑