排序五 归并排序
来源:互联网 发布:电脑该网络存储 编辑:程序博客网 时间:2024/05/16 11:46
归并排序(Merge Sort)
归并排序(Merge-Sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。—百度百科
- 时间复杂度:最好 O(n)=O(nlogn);平均O(n)=O(nlogn);最差O(n)=O(nlogn)
- 空间复杂度:O(n)=O(n)
- 稳定性: 稳定
算法描述
写作功底有限,不明白的推荐看一下麻省理工学院的算法导论公开课。
归并(Merge)
归并算法是指将两个有序序列合并为一个有序序列的方法。
例如,现有两个有序序列A[1,3,5], B[2,4,6],将其合并为一个序列C。
分别对A,B建一个游标索引,初始值为0。
第一步比较A,B索引的值A[1,3,5],B[2,4,6],1 < 2,所以C=[1,…], A的索引+1。
第二步比较A,B索引的值A[1,3,5],B[2,4,6],3 > 2,所以C=[1,2,…], B的索引+1。
第三步比较A,B索引的值A[1,3,5],B[2,4,6],3 < 4,所以C=[1,2,3,…], A的索引+1。
第四步比较A,B索引的值A[1,3,5],B[2,4,6],5 > 4,所以C=[1,2,3,4…], B的索引+1。
第五步比较A,B索引的值A[1,3,5],B[2,4,6],5 < 6,所以C=[1,2,3,4,5…],A的索引+1。
此时A中元素已全部取完,后续只需将B中元素按次序放入C即得C[1,2,3,4,5,6]
归并排序(Merge Sort)
- 分解:将序列分为两组A,B,再对A,B各自分成两组。依次类推,当每组中只有一个元素时,可认为每个小组都是有序的。
- 归并:将步骤1中分成的小组,递归的进行两两归并,直到归并为一个数组。
图片来自维基百科
排序示例
示例代码
public static void MergeSort(int[] S){ MergeSort(S, 0, S.Length - 1);}private static void MergeSort(int[] S, int first, int last){ if (first < last){ int mid = (first + last) / 2; MergeSort(S, first, mid); //分解 MergeSort(S, mid + 1, last);//分解 Merge(S, first, mid, last); //归并 }}/// <summary>/// 归并,将两个有序序列合并为一个有序序列/// </summary>private static void Merge(int[] S, int first, int mid, int last){ int[] temp = new int[last - first + 1]; int i = first; int j = mid + 1; int k = 0; while (i <= mid && j <= last){ if (S[i] <= S[j]){ temp[k++] = S[i++]; } else { temp[k++] = S[j++]; } } while (i <= mid){ temp[k++] = S[i++]; } while (j <= last){ temp[k++] = S[j++]; } Array.Copy(temp, 0, S, first, temp.Length);}
文中若有什么错误,欢迎留言指正。
转载请保留出处:http://blog.csdn.net/x1060549/article/details/78781643
阅读全文
0 0
- 排序五 归并排序
- Java排序五:归并排序
- 排序算法(五)--归并排序
- 排序算法(五) - 归并排序
- 【排序算法五】归并排序
- 排序算法之五 归并排序
- 排序七部曲之(五)归并排序
- 排序算法五—归并排序
- 八大排序学习之五归并排序
- 归并排序-归并排序
- 【啊哈!算法】之五、归并排序
- Java排序算法总结(五):归并排序
- Java排序算法总结(五):归并排序
- 神的规范:排序算法(五):归并排序
- 【数据结构与算法】排序算法之五:归并排序
- 排序算法之五——归并排序
- 【Java】五种常见排序之----------------归并排序
- 排序算法(五):JAVA实现归并排序
- 《OurwayBI基础入门系列--学会数据快速可视化》开课啦 !
- Mysql分库分表方案
- oracle--14.pl,sql语言
- AngularJs路由单向传值
- 【R语言 数据处理和可视化】一个手游公司销售额数据分析
- 排序五 归并排序
- HTML的 table 设计
- HTTPS的安全保护
- openstack安装
- 网址
- YII2框架RBAC 实例运用
- JPA @MappedSuperclass注解的使用说明
- 严重: Compilation error org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
- C#学习之路一