经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort
原理,把原始数组分成若干子数组,对每一个子数组进行排序,
继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组
举例
无序数组[6 2 4 1 5 9]
先看一下每个步骤下的状态,完了再看合并细节
第一步 [6 2 4 1 5 9]原始状态
第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍
第三步 [1 2 4 6] [5 9]继续两组两组合并
第四步 [1 2 4 5 6 9]合并完毕,排序完毕
输出结果[1 2 4 5 6 9]
合并细节
详细介绍第二步到第三步的过程,其余类似
第二步:[2 6] [1 4] [5 9]
两两合并,其实仅合并[2 6] [1 4],所以[5 9]不管它,
原始状态
第一个数组[2 6]
第二个数组[1 4]
--------------------
第三个数组[...]
第1步,顺序从第一,第二个数组里取出一个数字:2和1
比较大小后将小的放入第三个数组,此时变成下边这样
第一个数组[2 6]
第二个数组[4]
--------------------
第三个数组[1]
第2步,继续刚才的步骤,顺序从第一,第二个数组里取数据,2和4,
同样的比较大小后将小的放入第三个数组,此时状态如下
第一个数组[6]
第二个数组[4]
--------------------
第三个数组[1 2]
第3步,再重复前边的步骤变成,将较小的4放入第三个数组后变成如下状态
第一个数组[6]
第二个数组[...]
--------------------
第三个数组[1 2 4]
第4步,最后将6放入,排序完毕
第一个数组[...]
第二个数组[...]
--------------------
第三个数组[1 2 4 6]
[ 1 2 4 6 ]与[ 5 9 ]的合并过程与上边一样,不再分解
代码仅供参考
static void merge(int[] unsorted, int first, int mid, int last, int[] sorted){int i = first, j = mid;int k = 0;while (i < mid && j < last)if (unsorted[i] < unsorted[j])sorted[k++] = unsorted[i++];elsesorted[k++] = unsorted[j++];while (i < mid)sorted[k++] = unsorted[i++];while (j < last)sorted[k++] = unsorted[j++];for (int v = 0; v < k; v++)unsorted[first + v] = sorted[v];}static void merge_sort(int[] unsorted, int first, int last, int[] sorted){if (first + 1 < last){int mid = (first + last) / 2;Console.WriteLine("{0}-{1}-{2}", first, mid, last);merge_sort(unsorted, first, mid, sorted);merge_sort(unsorted, mid, last, sorted);merge(unsorted, first, mid, last, sorted);}}static void Main(string[] args){int[] x = { 6, 2, 4, 1, 5, 9 };int[] sorted = new int[x.Length];merge_sort(x, 0, x.Length, sorted);for (int i = 0; i < sorted.Length; i++){if (x[i] > 0)Console.WriteLine(x[i]);}Console.ReadLine();}
返回主目录 [经典排序算法][集锦]
转载于:https://www.cnblogs.com/kkun/archive/2011/11/23/merge_sort.html
经典排序算法 - 归并排序Merge sort相关推荐
- 十大经典排序算法-归并排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 经典排序算法 - 冒泡排序Bubble sort
经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...
- 经典排序算法 - 堆排序Heap sort
经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...
- 经典排序算法-----归并排序(C语言实现)
算法表述: 归并排序的基本原理是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.其实通俗来说,对于一个数来说自 ...
- [经典排序算法][集锦]
经典排序算法 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处 这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教 大多数排序算法都给出了每一步的状态,以方便初学者 ...
- 十大经典排序算法-桶排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 十大经典排序算法-快速排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 冒泡和快速排序的时间复杂度_十大经典排序算法——快速排序
目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a ...
- 十大经典排序算法-选择排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
最新文章
- 项目经理怎么在两周内熟悉一个项目的业务?
- input onblur事件在chrome/safari中失效
- Angular self study 2 - compile how is hello {{ name }} compiled
- POJ 2135 最小费用最大流
- 日语学习-多邻国-平假名3
- 查看容器ID以及如何在docker和宿主机之间复制文件
- 【codevs2333】【BZOJ2002】弹飞绵羊,第一次的LCT
- Java学习日报—消息队列—2021/11/23
- LeetCode Map Sum Pairs
- 华为企业网络常用图标大全(附PPT下载)
- 计算机多媒体教室管理制度,新疆大学多媒体教室管理制度
- pygame 游戏开场动画渲染学习,绘制 10*7=70 个小方块
- mysql查询高于平均_查询成绩高于平均分的成绩记录。
- PHP的一些常用算法
- 搜索引擎优化与信息检索有什么关联
- Pycharm 2019安装激活
- android studio制作.9图片,并且不改变原图大小
- Redis Java Client选型-Jedis Lettuce Redisson
- 储存程序通用计算机预设方案,【盛兴利合互动课堂功能―通用型备课及课堂授课应用】PjTime.COM 解决方案 盛兴利合...
- 文本自动化摘要方法学习笔记