经典排序算法 - 归并排序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相关推荐

  1. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  2. 经典排序算法 - 冒泡排序Bubble sort

    经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...

  3. 经典排序算法 - 堆排序Heap sort

    经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...

  4. 经典排序算法-----归并排序(C语言实现)

    算法表述: 归并排序的基本原理是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.其实通俗来说,对于一个数来说自 ...

  5. [经典排序算法][集锦]

    经典排序算法 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处 这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教 大多数排序算法都给出了每一步的状态,以方便初学者 ...

  6. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  7. 十大经典排序算法-快速排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  8. 冒泡和快速排序的时间复杂度_十大经典排序算法——快速排序

    目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a ...

  9. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. 项目经理怎么在两周内熟悉一个项目的业务?
  2. input onblur事件在chrome/safari中失效
  3. Angular self study 2 - compile how is hello {{ name }} compiled
  4. POJ 2135 最小费用最大流
  5. 日语学习-多邻国-平假名3
  6. 查看容器ID以及如何在docker和宿主机之间复制文件
  7. 【codevs2333】【BZOJ2002】弹飞绵羊,第一次的LCT
  8. Java学习日报—消息队列—2021/11/23
  9. LeetCode Map Sum Pairs
  10. 华为企业网络常用图标大全(附PPT下载)
  11. 计算机多媒体教室管理制度,新疆大学多媒体教室管理制度
  12. pygame 游戏开场动画渲染学习,绘制 10*7=70 个小方块
  13. mysql查询高于平均_查询成绩高于平均分的成绩记录。
  14. PHP的一些常用算法
  15. 搜索引擎优化与信息检索有什么关联
  16. Pycharm 2019安装激活
  17. android studio制作.9图片,并且不改变原图大小
  18. Redis Java Client选型-Jedis Lettuce Redisson
  19. 储存程序通用计算机预设方案,【盛兴利合互动课堂功能―通用型备课及课堂授课应用】PjTime.COM 解决方案 盛兴利合...
  20. 文本自动化摘要方法学习笔记

热门文章

  1. 《计算机网络:自顶向下方法(原书第6版)》一2.7 TCP套接字编程
  2. 修改TFS2013服务账户或者密码
  3. C#中DataRow的初始化
  4. 这个星期压力貌似比较大啊!
  5. C BNF grammar
  6. java并发编程-volatile内存实现和原理
  7. Nginx+Keepalived实现站点高可用
  8. 转Git学习碰到的问题
  9. C++ 著名程序库 概览
  10. MySQL Innodb数据库性能实践——VARCHAR vs CHAR