算法描述:

归并(Merge)排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

对一个数组进行归并排序主要分为以下三步:

1、分解。将一个数组分为两个个数组。

2.、治之。对分好的两个数组,分别用归并排序算法进行排序。

3、归并。将两个数组归并。

Java源代码:

package ljp.sort.merge; public class MergeSortDemo01 { private int[] list; //构造函数,初始化数组 public MergeSortDemo01() { list = new int[10]; for (int i = 0; i < list.length; i++) { list[i] = (int) (Math.random() * 1000); } } //排序函数 public void sort(int begin, int end) { int d = (begin + end) / 2; if (begin != end) { sort(begin, d); sort(d + 1, end); merge(begin, d + 1, end); } } //归并函数 private void merge(int start, int mid, int end) { System.out.println("合并 第" + (start+1) + "到" + mid + "之间的元素 和 第" + (mid+1) + "到" + (end+1)+"之间的元素"); int len = end - start + 1; int[] temp = new int[len]; int index = 0; int i = start; int j = mid; while (i < mid && j <= end) { if (list[i] > list[j]) { //System.out.println("第" + i + "个元素 大于 第" + j + "个元素"); temp[index] = list[j]; index++; j++; } else { //System.out.println("第" + i + "个元素 小于 第" + j + "个元素"); temp[index] = list[i]; index++; i++; } } if (i < mid) { while (index < len) { temp[index] = list[i]; i++; index++; } } if (j <= end) { while (index < len) { temp[index] = list[j]; j++; index++; } } for (int k = start; k <= end; k++) { list[k] = temp[k - start]; } display(); } public int getLength(){ return this.list.length; } public void display() { for (int i : list) { System.out.print(i + " "); } System.out.println(); } public static void main(String[] args) { MergeSortDemo01 mergesort = new MergeSortDemo01(); System.out.println("排序前:"); mergesort.display(); mergesort.sort(0, mergesort.getLength()-1); } }

运行结果:

排序前:
824 692 469 255 518 492 177 403 325 350
合并 第1到1之间的元素 和  第2到2之间的元素
692 824 469 255 518 492 177 403 325 350
合并 第1到2之间的元素 和  第3到3之间的元素
469 692 824 255 518 492 177 403 325 350
合并 第4到4之间的元素 和  第5到5之间的元素
469 692 824 255 518 492 177 403 325 350
合并 第1到3之间的元素 和  第4到5之间的元素
255 469 518 692 824 492 177 403 325 350
合并 第6到6之间的元素 和  第7到7之间的元素
255 469 518 692 824 177 492 403 325 350
合并 第6到7之间的元素 和  第8到8之间的元素
255 469 518 692 824 177 403 492 325 350
合并 第9到9之间的元素 和  第10到10之间的元素
255 469 518 692 824 177 403 492 325 350
合并 第6到8之间的元素 和  第9到10之间的元素
255 469 518 692 824 177 325 350 403 492
合并 第1到5之间的元素 和  第6到10之间的元素
177 255 325 350 403 469 492 518 692 824

该算法的时间复杂度为O(nlog2n),算法是稳定的。

转载于:https://www.cnblogs.com/JPAORM/archive/2012/04/13/2510087.html

排序算法第三篇——归并排序相关推荐

  1. [ 数据结构 -- 手撕排序算法第三篇 ] 希尔排序

    手撕排序算法系列之:希尔排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算法:排序算 ...

  2. python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...

    前言 原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码 为什么选这三个排序呢? 首先快排是必须掌握的 看看快排在最坏的情况下(O(n²)),且不使用辅助空间 ...

  3. 排序算法lowb三人组-插入排序

    排序算法lowb三人组-插入排序 def insert_sort(li):for i in range(1, len(li)): # i表示摸到的牌的下标tmp = li[i] # 摸到的牌j = i ...

  4. 八大排序算法合集 (归并排序、交换排序、插入排序、选择排序......)

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  5. 经典排序算法(8)——归并排序算法详解

    归并排序(Merge sort),是创建在归并操作上的一种有效的排序算法,效率为O(nlog n).该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同 ...

  6. [ 数据结构 -- 手撕排序算法第四篇 ] 选择排序

    手撕排序算法系列之第四篇:选择排序. 从本篇文章开始,我会介绍并分析常见的几种排序,大致包括直接插入排序,冒泡排序,希尔排序,选择排序,堆排序,快速排序,归并排序等. 大家可以点击此链接阅读其他排序算 ...

  7. 八大排序算法总结——Java篇

    概述: 作为算法的鼻祖,八大排序是我们一定要了解学习的,废话不多说,直奔主题. 一. 直接插入排序 二.希尔排序 三.冒泡排序 四.快速排序 五.简单选择排序 六.堆排序 七.基数排序 八.归并排序 ...

  8. 冒泡和快速排序的时间复杂度_java 八大排序算法 冒泡排序 快速排序 堆排序 归并排序 等...

    八大排序算法 一.直接插入 1.基本思路 在要排序的一组数中,假设前面(n-1) [n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的.如此反复循环 ...

  9. 图解排序算法(基础篇)

    文章目录 一.冒泡排序 1.1 冒泡排序的第一种写法 1.2 冒泡排序的第二种写法 1.3 冒泡排序的第三种写法 二.选择排序 2.1 二元选择排序 三.插入排序 排序算法是一类非常经典的算法,说来简 ...

最新文章

  1. SQL数据库无法附加 系统表损坏修复 数据库中病毒解密恢复
  2. 我的同学是计算机作文,同学相见作文
  3. mysql update n_mysql修改记录时update操作 字段=字段+字符串
  4. C++ 百炼成钢20
  5. @scheduled 每30s 执行一次_全球首发5G神U麒麟820,荣耀30S卡位5G档位最强,售价2399起...
  6. 基础功能2-python修改文件中所有文件名
  7. 为什么新装的mysql5.7服务无法启动_Mysql5.7为什么无法启动?请大家帮忙
  8. 做咨询以来,从来坚守一个词——“系统”
  9. vba 判断目标单元格内容改变的代码_【VBA小代码】批量改变单元格部分字符格式...
  10. 简化CommunityServer模板机制
  11. java 打印字体中的字_输入文字,输出点阵文字
  12. netty实现gmssl_gmssl java api 编译
  13. MOSFET | 如何看懂MOSFET手册?①
  14. C语言编程练习:定义判断素数函数int isPrime(int n);若n是素数返回1,否则返回0。调用isPrime函数,输出2~1000之内所有素数,按一行10个素数形式输出。
  15. 开源推荐 | CoDo开源一站式DevOps平台
  16. 经典的图像分割方法总结
  17. 【karle 游戏】永劫无间太刀连招
  18. 金山 V8 终端安全系统 默认弱口令漏洞
  19. 关于sql sp4补丁
  20. Visual C++网络编程经典案例详解 第5章 网页浏览器 CHtmlView类 查看源文件

热门文章

  1. 教你用SingalR实现后台开发程序运行时时检测
  2. 借助模糊测试 深耕细作你的压力测试
  3. 读书笔记_量化交易如何建立自己的算法交易03
  4. ubuntu终端一次多条命令方法和区别
  5. 月薪2W和月薪10W的差别,怎么判断一个产品经理的专业水平高低?
  6. 如何利用FineBI做财务分析
  7. FineReport新增多项目甘特图示例及操作
  8. java正则表达式去除空格_去掉字符串前后所有空格的正则表达式
  9. aiohttp保存MySQL_python链家网高并发异步爬虫asyncio+aiohttp+aiomysql异步存入数据
  10. vue 查看变量类型_Vue学习 开始走向VUE开发2---插值使用详解